Manacher算法求最大的回文串长度
#include <stdio.h>
#include <string.h>
int min(int a, int b) {
return a > b ? b : a;
}
char oldStr[110005], newStr[220010];
int p[220010];
int main() {
int maxLen, maxId, id;
int i;
while (scanf("%s", &oldStr[1]) != EOF) {
memset(p, 0, sizeof(p));
for (i = 1; oldStr[i] != '\0'; i++) {
newStr[i*2] = oldStr[i];
newStr[i*2 + 1] = '#';
}
newStr[0] = '?'; newStr[1] = '#';
newStr[i*2 + 1] = '\0';
maxLen = maxId = id = 0;
for (i = 1; newStr[i] != '\0'; i++) {
if (maxId > i) {
p[i] = min(p[2*id - i], maxId - i);
} else {
p[i] = 1;
}
while (newStr[i + p[i]] == newStr[i - p[i]]) {
p[i]++;
}
if (p[i] + i > maxId) {
maxId = p[i] + i;
id = i;
}
if (p[i] > maxLen) {
maxLen = p[i];
}
}
printf("%d\n", maxLen - 1);
}
return 0;
}