#include <array>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
void manacher(const string &s, int m[]) {
string a;
const int len = s.length();
int l = 0;
a[l++] = '$';
a[l++] = '#';
for (int i = 0; i < len; i++) {
a[l++] = s[i];
a[l++] = '#';
}
a[l] = 0;
int mx = 0, id = 0;
for (int i = 0; i < l; i++) {
m[i] = mx > i ? min((int)m[2 * id - i], mx - i) : 1;
while (a[i + m[i]] == a[i - m[i]]) m[i]++;
if (i + m[i] > mx) {
mx = i + m[i];
id = i;
}
}
}
int m[1000];
int main() {
string s;
cin >> s;
manacher(s, m);
for (int i = 0; i <= 2 * s.length(); i++) {
printf("%3d", i);
}
putchar('\n');
for (int i = 0; i <= 2 * s.length(); i++) {
if (i != 0 && i % 2 == 0)
printf(" %c", s[i / 2 - 1]);
else
printf(" ");
}
putchar('\n');
for (int i = 0; i <= 2 * s.length(); i++) {
printf("%3d", m[i] - 1);
}
}
本作品使用基于以下许可授权:Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.