题目大意:要求你求出一个字符串的最长回文子串,并将最长回文子串按要求经过转码输出
解题思路:manacher的裸题
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 400010;
char str[N], tmp[10];
int p[N];
int len;
void init() {
len = strlen(str);
for (int i = len; i >= 0; i--) {
str[i * 2 + 2] = str[i];
str[i * 2 + 1] = '#';
}
str[0] = '$';
}
void solve() {
int mx = 0, id, ansid, mxp = 0;
for (int i = 2; i < len * 2 + 1; i++) {
if (mx > i) p[i] = min(p[id * 2 - i], mx - i);
else p[i] = 1;
while (str[i - p[i]] == str[i + p[i]]) p[i]++;
if (p[i] > mxp) {
mxp = p[i];
ansid = i;
}
if (p[i] + i >= mx) {
mx = p[i] + i;
id = i;
}
}
if (p[ansid] - 1 < 2) printf("No solution!\n");
else {
printf("%d %d\n", (ansid - p[ansid] + 2) / 2 - 1, (ansid + p[ansid] - 2) / 2 - 1);
int k = tmp[0] - 'a';
for (int i = ansid - p[ansid] + 2; i <= ansid + p[ansid] - 2; i += 2)
printf("%c", (str[i] - 'a' - k + 26) % 26 + 'a');
printf("\n");
}
}
int main() {
while (scanf("%s%s", tmp, str) != EOF) {
init();
solve();
}
return 0;
}