正题
以i结尾出现新的本质不同的答案,当且仅当这个点对应PAM上的节点长度为4的倍数,且<=该节点长度的1/2的第一个fail祖先的长度恰好为该节点1/2.
#include<bits/stdc++.h>
using namespace std;
const int N=500010;
struct Palindrome_AutoMaton{
int n,tot,las;
int ch[N][26],fail[N],len[N],num[N],ans[N];
char s[N];
void init(){tot=1;las=0;fail[0]=1;fail[1]=0;len[1]=-1;}
int gfail(int x,int pos){
while(s[pos-len[x]-1]!=s[pos]) x=fail[x];
return x;
}
int insert(int pos,int c){
int p=gfail(las,pos);
if(!ch[p][c]){
int now=++tot;
fail[now]=ch[gfail(fail[p],pos)][c];
len[now]=len[p]+2;
int tmp=num[p];
while(s[pos-len[tmp]-1]!=s[pos] || len[ch[tmp][c]]*2>len[now]) tmp=fail[tmp];
num[now]=ch[tmp][c];ch[p][c]=now;
}
las=ch[p][c];
return len[las]%4==0&&len[num[las]]==len[las]/2?len[las]:0;
}
void build(){
scanf("%d",&n);
scanf("%s",s+1);
int ans=0;init();
for(int i=1;i<=n;i++) ans=max(ans,insert(i,s[i]-'a'));
printf("%d\n",ans);
}
}PAM;
int main(){
PAM.build();
}
本文深入探讨了PAM回文自动机的构造与应用,详细解释了如何通过插入字符更新自动机状态,以及如何查找最长的回文子串。代码示例展示了初始化过程、失败指针的更新策略和插入操作的细节。
264

被折叠的 条评论
为什么被折叠?



