回文自动机

#include <cstdio>
#include <cstring>

const int N = 5e5 + 5;
char c[N];
int n, t[N][26], fail[N], len[N], dep[N], trc, ans, x;

int Find(int x, int y) {
    for (; c[y-len[x]-1] != c[y]; x = fail[x]);
    return x;
}

int main() {
    scanf("%s", c + 1);
    n = strlen(c + 1);
    fail[0] = trc = 1; 
    c[0] = len[1] = -1; 
    for (int i = 1; i <= n; ++i) {
        c[i] = (c[i] - 97 + ans) % 26;
        x = Find(x, i);
        if (!t[x][c[i]]) {
            fail[++trc] = t[Find(fail[x], i)][c[i]];
            t[x][c[i]] = trc;
            dep[trc] = dep[fail[trc]] + 1;
            len[trc] = len[x] + 2;
        }
        printf("%d ", ans = dep[x=t[x][c[i]]]);
    }
    return 0;
}
posted @ 2020-12-23 07:39  Shawk  阅读(15)  评论(0编辑  收藏  举报