每次加一个串 x 会增加 n-max{LCP(x,i)},因为是树上,max{LCP(x,i)}就肯定是dfs序中跟它相邻的点,也就是它们的lca深度最深。
那么就用set维护一下dfs序,比较的话,用主席树维护hash
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <set>
#include <cstring>
#include <string>
#define fi first
#define se second
using namespace std;
typedef unsigned long long ll;
typedef pair<ll,ll> pari;
const int N=100010,P1=1e9+7,P2=1e9+9;
const pari base={
7,29};
int n,q,t,cnt,g,rt[N*50],ls[N*50],rs[N*50],tag[N*50],tot[N*50];
pari pw[N],v[N*50],p[N];
pari operator +(const pari &a,const pari &b){ return pari((a.fi+b.fi)%P1,(a.se+b.se)%P2); }
pari operator -(const pari &a,const pari &b){ return pari((a.fi+P1-b.fi)%P1,(a.se+P2-b.se)%P2); }
pari operator *(const pari &a,const pari &b){ return pari((a.fi*b.fi)%P1,(a.se*b.se)%P2); }
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000</