显然可以构造一棵后缀树,将问题转化成了在这棵树上找到两个点\(i,j\),使得\(w_i\bigoplus w_j+ len_{\rm LCA(i,j)}\)最大
于是在树上\(dfs\)的时候启发式合并\(\rm trie\)就好了,发现自己已经菜到不会写\(\rm trie\)了,\(\rm trie\)的插入做到最后一层还是有节点的,得先添加这个节点,之后才能返回
#include#define re register#define LL long longconst int maxn=2e5+5;inline int read() { char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;}std::vector v[maxn];char S[maxn>>1];int a[maxn>>1],tax[maxn>>1],A[maxn];int ch[maxn*25][2];int len[maxn],son[maxn][26],rt[maxn],fa[maxn];int n,lst=1,cnt=1,tot,ans;inline int max(int a,int b) {return a>b?a:b;}inline int ins(int now,int w,int v) { if(!now) now=++tot; if(w==-1) return now; int u=(v>>w)&1; ch[now][u]=ins(ch[now][u],w-1,v); return now;}inline int chk(int now,int w,int v) { if(w==-1) return 0; int u=(v>>w)&1; if(ch[now][u^1]) return (1< v[fa[x]].size()) std::swap(rt[x],rt[fa[x]]),std::swap(v[x],v[fa[x]]); int now=0; for(re int j=0;j