APIO2014 回文串

建回文树。

cnt*len取max。

By:大奕哥

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=3e5+5;
 4 const int M=26;
 5 typedef long long ll;
 6 struct Palindromic_Tree{
 7     int nex[N][M];
 8     int fail[N];
 9     int cnt[N];
10     int num[N];
11     int len[N];
12     int S[N];
13     int last;
14     int n;
15     int p;
16     
17     int newnode(int l)
18     {
19         for(int i=0;i<M;++i)nex[p][i]=0;
20         cnt[p]=0;
21         num[p]=0;
22         len[p]=l;
23         return p++;
24     }
25     
26     void init()
27     {
28         p=0;
29         newnode(0);
30         newnode(-1);
31         last=0;
32         n=0;
33         S[n]=-1;
34         fail[0]=1;
35     }
36     
37     int get_fail(int x){
38         while(S[n-len[x]-1]!=S[n])x=fail[x];
39         return x;
40     }
41     
42     void add(int c){
43         c-='a';
44         S[++n]=c;
45         int cur=get_fail(last);
46         if(!nex[cur][c]){
47             int now=newnode(len[cur]+2);
48             fail[now]=nex[get_fail(fail[cur])][c];
49             nex[cur][c]=now;
50             num[now]=num[fail[now]]+1;
51         }
52         last=nex[cur][c];
53         cnt[last]++;
54     }
55     
56     long long count(){
57         long long ans=0;
58         for(int i=p-1;i>=0;--i)cnt[fail[i]]+=cnt[i],ans=max(ans,1ll*cnt[i]*len[i]);
59         return ans;
60     }
61 }T;
62 char s[N];
63 int main()
64 {
65     scanf("%s",s);
66     int n=strlen(s);
67     T.init();
68     for(int i=0;i<n;++i)
69     {
70         T.add(s[i]);
71     }
72     printf("%lld",T.count());
73     return 0;
74 }
原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8261024.html