• 回文自动机


    译名为“回文树”,是一种专门处理回文串的数据结构,类似于马拉车,但更为强大。是由两颗分别存储偶数回文串树和存储奇数回文串树组成,每个节点代表母串的回文串,两树之间中用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;
  • 相关阅读:
    洛谷 2846 (线段树)
    Conclusion
    codevs 2495 水叮当的舞步IDA*
    1247 排排站 USACO(查分+hash)
    洛谷 1373 小a和uim之大逃离
    noip 2012 疫情控制
    poj 1780 code(欧拉路)
    uva 1391 Astronauts(2-SAT)
    uva 1146 Now or late (暴力2-SAT)
    uva 11324 The Largest Clique (Tarjan+记忆化)
  • 原文地址:https://www.cnblogs.com/wmj6/p/11251595.html
Copyright © 2020-2023  润新知