bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)

https://www.lydsy.com/JudgeOnline/problem.php?id=2565

正着构造回文自动机

倒过来再构造一个回文自动机

分别求出以位置i开始的和结尾的最长回文串

#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; #define N 100001 char ss[N];
int s[N]; int L1[N],L2[N]; struct TREE
{
int tot,last;
int len[N],tr[N][],fail[N];
int p,c,np,t; int n; void clear()
{
tot=; last=;
memset(tr[],,sizeof(tr[]));
memset(tr[],,sizeof(tr[]));
fail[]=; fail[]=;
len[]=; len[]=-;
s[]=-; n=;
} int newnode(int f)
{
tot++;
memset(tr[tot],,sizeof(tr[tot]));
fail[tot]=;
len[tot]=len[f]+;
return tot;
} int extend(int c)
{
s[++n]=c;
p=last;
while(s[n--len[p]]!=c) p=fail[p];
if(!tr[p][c])
{
np=newnode(p);
t=fail[p];
while(s[n--len[t]]!=c) t=fail[t];
fail[np]=tr[t][c];
tr[p][c]=np;
}
else np=tr[p][c];
return len[last=np];
} }tree; int main()
{
scanf("%s",ss+);
int n=strlen(ss+);
tree.clear();
for(int i=;i<=n;++i)
L1[i]=tree.extend(ss[i]-'a');
tree.clear();
for(int i=n;i;--i)
L2[i]=tree.extend(ss[i]-'a');
int ans=;
for(int i=;i<n;++i) ans=max(ans,L1[i]+L2[i+]);
printf("%d",ans);
}
上一篇:一、Log4Net配置


下一篇:Google大牛分享的面试秘籍