-1. 瞎BB
胡了道回文自动机的题,胡完后发现自己根本就不会回文自动机……就来学了。
0和1. 直接丢代码
#include <bits/stdc++.h>
#define N 500005
#define ll long long
#define For(i,x,y) for(int i=(x);i<=(y);++i)
#define Rof(i,x,y) for(int i=(x);i>=(y);--i)
using namespace std;
int cnt=1,lst=0;
char s[N];
struct PAM{
int len,fail,ch[27],num;
PAM (){ len=fail=0;For(i,1,26)ch[i]=0;num=0;}
}p[N];
int getfail(int i,int x){
while(s[i-p[x].len-1]!=s[i])
x=p[x].fail;
return x;
}
void insert(int i,int c){
int now=lst;
int y=getfail(i,now);
if(!p[y].ch[c]){
p[++cnt].len=p[y].len+2;
int z=getfail(i,p[y].fail);
p[cnt].fail=p[z].ch[c];
p[cnt].num=p[p[cnt].fail].num+1;
p[y].ch[c]=cnt;
}
lst=p[y].ch[c];
}
int main(){
int lstans=0;
scanf("%s",s+1);int n=strlen(s+1);
p[1].len=-1,p[0].len=0;
p[0].fail=1,p[1].fail=0;
For(i,1,n){
if(i!=1) s[i]=(s[i]-97+lstans)%26+97;
insert(i,s[i]-'a'+1);
lstans=p[lst].num;
printf("%d ",p[lst].num);
}
}
2.一种不基于势能分析的插入/删除
gugugu