【模板】回文树
打多校的题发现不会平衡树,来找到模板题做做。。。。
引用:https://blog.csdn.net/qq_38995588/article/details/80644655
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int N=(300000+9)*2; 5 struct P_Tree{ 6 int nex[N][30],fail[N],len[N],num[N],cnt[N],S[N],las; 7 int p;//节点指针 8 int n;//字符指针 9 int newnode(int l){ 10 for(int i=0;i<26;++i) nex[p][i]=0; 11 cnt[p]=num[p]=0; 12 len[p]=l; 13 return p++; 14 } 15 void init(){ 16 p=0; 17 newnode(0);newnode(-1); 18 las=0; 19 n=0; 20 S[0]=-1; 21 fail[0]=1; 22 } 23 int get_fail(int x){ 24 while(S[n-len[x]-1]!=S[n]) x=fail[x]; 25 return x; 26 } 27 void add(int c){ 28 c-='a'; 29 S[++n]=c; 30 int cur=get_fail(las); 31 if(!nex[cur][c]){ 32 int now=newnode(len[cur]+2); 33 fail[now]=nex[get_fail(fail[cur])][c]; 34 nex[cur][c]=now; 35 num[now]=num[fail[now]]+1; 36 } 37 las=nex[cur][c]; 38 ++cnt[las]; 39 } 40 void count(){ 41 for(int i=p-1;i>=0;--i) cnt[fail[i]]+=cnt[i]; 42 } 43 }pam; 44 int main(){ 45 string str; 46 cin>>str; 47 int ll=str.size(); 48 pam.init(); 49 for(int i=0;i<ll;++i){ 50 pam.add(str[i]); 51 } 52 pam.count(); 53 LL ans=0; 54 for(int i=2;i<pam.p;++i) ans=max((LL)pam.cnt[i]*pam.len[i],ans); 55 printf("%lld",ans); 56 return 0; 57 }