回文自动机
- 如果不考虑空间回文自动机几乎可以替代 manacher 吧
构造
- 比较简单,就直接放代码了
const int N=1e6+10;
char S[N];
int n,t[N][26],fail[N],len[N],num[N];
int tot=1,cur,last=0;
inline int getpos(int x,int i) {
while(i-len[x]-1<1 || S[i-len[x]-1]!=S[i]) x=fail[x];
return x;
}
signed main(){
scanf("%s",S+1);
n=strlen(S+1);
fail[0]=1;len[1]=-1;
FOR(i,1,n) {
if(i>1) S[i]=(S[i]+last-97)%26+97;
int pos=getpos(cur,i);
if(!t[pos][S[i]-'a']) {
fail[++tot]=t[getpos(fail[pos],i)][S[i]-'a'];
len[tot]=len[pos]+2;
num[tot]=num[fail[tot]]+1;
t[pos][S[i]-'a']=tot;
}
cur=t[pos][S[i]-'a'];
cout<<(last=num[cur])<<' ';
}
return 0;
}
有趣的性质
-
对于插入一般我们都是在末尾插入,但是其实也可以同时进行从头插入
-
因为可以发现整个字符串的不管是前后维护的回文子串是一样的,所以对于前/后缀都维护一下最长的回文子串所在的结点就可以了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】