【学习笔记】回文自动机(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(❌️)

posted @ 2026-08-25 08:51  Aistyr  阅读(26)  评论(0)    收藏  举报