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 }
生命中真正重要的不是你遭遇了什么,而是你记住了哪些事,又是如何铭记的。