回文自动机
作者:
狂气电波
,
2023-12-06 22:48:55
,
所有人可见
,
阅读 100
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define deb(n) cout << #n << "=" << n << " "
#define debug(n) cout << #n << "=" << n << endl
#define div() cout << "_______________" << endl
const int N = 5e5 + 10;
string s;
int n, lst, len[N];
int now, tot = 1, fail[N], cnt[N], T[N][26];
int getfail(int pre, int p) {
while (p - len[pre] - 1 <= 0 || s[p - len[pre] - 1] != s[p]) pre = fail[pre];
return pre;
}
int insert(char c, int id) {
int p = getfail(now, id);
if (!T[p][c - 'a']) {
fail[++tot] = T[getfail(fail[p], id)][c - 'a'];
T[p][c - 'a'] = tot;
len[tot] = len[p] + 2;
cnt[tot] = cnt[fail[tot]] + 1;
}
return cnt[now = T[p][c - 'a']];
}
void oper() {
cin >> s; s = "?" + s; n = s.size() - 1;
fail[0] = 1, len[1] = -1;
for (int i = 1; i <= n; i++) {
if (i > 1) s[i] = (s[i] - 'a' + lst) % 26 + 'a';
cout << (lst = insert(s[i], i)) << " ";
}
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1; //cin >> t;
while (t--) oper();
return 0;
}