bzoj 3676: [Apio2014]回文串【后缀自动机+manacher】
2018-04-20 16:21
555 查看
用manacher找出本质不同的回文子串放在SAM上跑
#include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; const int N=600005; int n,p ; char s ,c ; long long ans; struct SAM { int la,cnt,pos ,len ,si ,sa ,fa ,ch [27],c ,f [19],de ; SAM() { la=++cnt; } void ins(int c,int id) { int p=la,cur=la=++cnt; len[cur]=len[p]+1; si[cur]=1; pos[id]=la; for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=cur; if(!p) fa[cur]=1; else { int q=ch[p][c]; if(len[q]==len[p]+1) fa[cur]=q; else { int nt=++cnt; len[nt]=len[p]+1; memcpy(ch[nt],ch[q],sizeof(ch[q])); fa[nt]=fa[q]; fa[q]=fa[cur]=nt; for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nt; } } } void wk() { for(int i=1;i<=cnt;i++) c[len[i]]++; for(int i=1;i<=n;i++) c[i]+=c[i-1]; for(int i=cnt;i>=1;i--) sa[c[len[i]]--]=i; for(int i=cnt;i>=1;i--) si[fa[sa[i]]]+=si[sa[i]]; for(int i=1;i<=cnt;i++) { int u=sa[i]; de[u]=de[fa[u]]+1; f[u][0]=fa[u]; for(int j=1;(1<<j)<=de[u];j++) f[u][j]=f[f[u][j-1]][j-1]; } } void ques(int l,int r) { int x=pos[r]; for(int i=18;i>=0;i--) if(len[f[x][i]]>=r-l+1) x=f[x][i]; ans=max(ans,1ll*si[x]*(r-l+1));//cerr<<l<<" "<<r<<" "<<si[x]*(r-l+1)<<endl; } }sam; int main() { scanf("%s",s+1); n=strlen(s+1); for(int i=1;i<=n;i++) sam.ins(s[i]-'a',i); sam.wk(); s[0]='+';s[n+1]='*'; int mx=0,id; for(int i=1;i<=n;i++) { if(mx>i) p[i]=min(mx-i,p[2*id-i-1]); else p[i]=0; while(s[i+p[i]+1]==s[i-p[i]]) { p[i]++; sam.ques(i-p[i]+1,i+p[i]); } if(p[i]+i>mx) mx=p[i]+i,id=i; } mx=0; for(int i=1;i<=n;i++) { if(mx>i) p[i]=min(mx-i-1,p[2*id-i]); else { p[i]=1; sam.ques(i-p[i]+1,i+p[i]-1); } while(s[i+p[i]]==s[i-p[i]]) { p[i]++; sam.ques(i-p[i]+1,i+p[i]-1); } if(p[i]+i>mx) mx=p[i]+i,id=i; } printf("%lld\n",ans); return 0; }
相关文章推荐
- [BZOJ3676][Apio2014]回文串-后缀自动机+Manacher | | 回文树
- [manacher 后缀自动机 || 回文自动机] BZOJ 3676 [Apio2014]回文串
- [bzoj3676][Apio2014]回文串——Manacher+后缀自动机+倍增
- BZOJ 3676 UOJ 103 APIO 2014 后缀自动机 Manacher
- BZOJ3676 APIO2014回文串(manacher+后缀自动机)
- bzoj 3676: [Apio2014]回文串 manachar+后缀自动机+倍增(回文树)
- [Bzoj3676][Apio2014]回文串(后缀自动机)(parent树)(倍增)
- 【bzoj3676】[Apio2014]回文串 后缀自动机
- 【BZOJ3676】[Apio2014]回文串 【回文自动机】
- [回文自动机] BZOJ 3676: [Apio2014]回文串
- [BZOJ3676][Apio2014]回文串(回文自动机)
- BZOJ 3676: [Apio2014]回文串 回文串自动机
- 【APIO2014】回文串 jzoj 3654/洛谷 3649/bzoj 3676 回文树(回文自动机)
- 字符串(马拉车算法,后缀数组,稀疏表):BZOJ 3676 [Apio2014]回文串
- [BZOJ3676] [Apio2014]回文串 && Manacher + Hash
- [BZOJ]3676 [APIO2014] 回文串 回文自动机
- 【回文自动机】bzoj3676 [Apio2014]回文串
- 回文自动机 模板 bzoj3676【Apio2014】回文串
- [BZOJ]3676: [Apio2014]回文串 回文自动机
- bzoj3676 [Apio2014]回文串(回文自动机)