【学习笔记】回文自动机(PAM)
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int trans[N][26];//trie
int fail[N];//fail
int len[N];//长度
int num[N];//答案
int pre=0;//上一个点
int cnt=1;//总数,一定从1开始!!
string s;
int Fail(int x,int tp){
while(tp-len[x]-1<0||s[tp-len[x]-1]!=s[tp]) x=fail[x];
return x;
}
void insert(char c,int tp){
int fa=Fail(pre,tp);
if(!trans[fa][c-'a']){
++cnt;
//更新节点信息
len[cnt]=len[fa]+2;
fail[cnt]=trans[Fail(fail[fa],tp)][c-'a'];//Fail(fail[fa],tp)不是fail[fa]
num[cnt]=num[fail[cnt]]+1;
trans[fa][c-'a']=cnt;//更新放后面,防止自循环
}
pre=trans[fa][c-'a'];
}
int main(){
cin>>s;
len[0]=0;len[1]=-1;
fail[0]=1;fail[1]=1;
int ans=0;
for(int i=0;i<s.size();i++){
s[i]=(s[i]-97+ans)%26+97;
insert(s[i],i);
ans=num[pre];
cout<<ans<<" ";
}
return 0;
}
最小回文划分(❌️)
Series Link(❌️)

浙公网安备 33010602011771号