码迷,mamicode.com
首页 > 其他好文 > 详细

回文自动机

时间:2019-07-26 17:43:07      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:ast   str   偶数   结构   适配   节点   int   之间   count   

译名为“回文树”,是一种专门处理回文串的数据结构,类似于马拉车,但更为强大。是由两颗分别存储偶数回文串树和存储奇数回文串树组成,每个节点代表母串的回文串,两树之间中用fail指针连接。

struct Palindromic_Tree{
    int next[N][30]; //节点之间连边 
    int fail[N]; //适配指针 表示当前回文串的最长回文后缀 
    int len[N]; //当前回文串的长度 
    int cnt[N]; //回文串的个数 
    int id[N]; //回文串的右端点 
    int S[N];
    int last,n,p;
    int newnode(int l){//新建节点
        for(int i=0;i<26;i++) next[p][i]=0;//新建的节点为p,先消除它的子节点
        cnt[p]=0;
        len[p]=l;
        return p++;//勿打成++p,因为此节点为p,我们应返回p
    }
    void init(){
        last=n=p=0;
        newnode(0); newnode(-1);
        S[0]=-1; fail[0]=1;
    }
    int get_fail(int x){
        while(S[n-len[x]-1]!=S[n])    x=fail[x];
        return x;
    }
    void add(int c){
        c-=a;
        S[++n]=c;
        int po=get_fail(last);
        if(!next[po][c]){
            int now=newnode(len[po]+2);
            fail[now]=next[get_fail(fail[po])][c];
            next[po][c]=now;
        }
        last=next[po][c];
        cnt[last]++;
        id[last]=n;
    }
    void count(){
        for(int i=p-1;i>=0;i--)
            cnt[fail[i]]+=cnt[i];
    }
}pat;

 

回文自动机

标签:ast   str   偶数   结构   适配   节点   int   之间   count   

原文地址:https://www.cnblogs.com/wmj6/p/11251595.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!