【模板】回文树

打多校的题发现不会平衡树,来找到模板题做做。。。。

引用: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 }
View Code

 

posted @ 2019-08-12 16:03  小布鞋  阅读(107)  评论(0编辑  收藏  举报