摘要:#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来源:福建丽丽
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!