【留坑待填】【学习笔记】回文自动机

-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

猜你喜欢

转载自www.cnblogs.com/PsychicBoom/p/12061337.html
今日推荐