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

[P5496] 【模板】回文自动机(PAM)

时间:2020-02-02 15:50:41      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:pam   trie   class   name   scan   ast   src   its   c++   

蒟蒻开始学回文自动机了
技术图片

(板子基本靠搬运)

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
struct PAM_Trie {
    int ch[26];
    int fail, len, num;
};
struct PAM {
    PAM_Trie b[N];
    int n, last, cnt, s[N];
    PAM() {
        b[0].len = 0;
        b[1].len = -1;
        b[0].fail = 1;
        b[1].fail = 0;
        last = 0;
        cnt = 1;
    }
    int get_fail(int x) {
        while(s[n - b[x].len - 1] != s[n]) {
            x = b[x].fail;
        }
        return x;
    }
    void insert(char ch) {
        s[++n]=ch;
        int p = get_fail(last);
        if(!b[p].ch[s[n]]) {
            b[++cnt].len = b[p].len + 2;
            int tmp = get_fail(b[p].fail);
            b[cnt].fail = b[tmp].ch[s[n]];
            b[cnt].num = b[b[cnt].fail].num + 1; //
            b[p].ch[s[n]] = cnt;
        }
        last = b[p].ch[s[n]];
    }
} P;
int length;
char c[N];
int main() {
    scanf("%s", c + 1);
    length = strlen(c + 1);
    int k=0;
    P.s[0]=26;
    for(int i=1;i<=length;i++) {
        c[i]=(c[i]-97+k)%26 + 97;
        P.insert(c[i]-'a');
        printf("%d ",P.b[P.last].num);
        k=P.b[P.last].num;
    }
}

[P5496] 【模板】回文自动机(PAM)

标签:pam   trie   class   name   scan   ast   src   its   c++   

原文地址:https://www.cnblogs.com/mollnn/p/12252277.html

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