北京大学 2024 年《数据结构与算法A(实验班)》

360影视 2024-12-23 21:40 3

摘要:#includeusingnamespacestd;#define ll long long #define ull unsigned long long #define rep(i,a,b) for(int i=(a);i

题目

思路来源

群友

题解

如果把一对树边连起来的下标,分配一对相同的字母,

那需要快速check一段区间是否是回文串

如果已经是回文串,说明这个区间的前半段[L,l]和[r,R]中任意下标对(l-i,r+i)已经连通,

就不需要再考虑当前值了,可以直接跳过,

否则每次二分下一个在当前值域下可合并的下标对,然后合并,直至生成树全联通

所以需要线段树维护正串和反串的哈希值,快速check正串一段和反串一段哈希值是否相等

给每个并查集连通分量分配一个随机的哈希值,

同一个连通分量的哈希值是相等的,合并的时候启发式合并挂上去,即少的往多的上面挂

代码

#includeusingnamespacestd;#define ll long long #define ull unsigned long long #define rep(i,a,b) for(int i=(a);i=(b);--i) typedefdoubledb;typedefpairP;#define fi first #define se second #define pb push_back #define dbg(x) cerrnow[N];llans;ullb[N],pw[N];intfind(intx){returnpar[x]==x?x:par[x]=find(par[x]);}structsegtree{intn;structnode{intl,r;ullv,w;}e[N>1;bld(p>1;chg(pmid),x,v);up(p);}nodecnt(intp,intql,intqr){if(ql>1;if(ql>mid)returncnt(p

来源:福建丽丽

相关推荐