最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11642 Accepted Submission(s): 4236
Problem Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa abab
Sample Output
4 3
Source
#include <cstdio>
#include <cstring>
const int N = 220010;
char str[N];
int p[N];
inline int min(int a, int b) {
return a < b ? a : b;
}
int main() {
while (~scanf("%s", str)) {
int len = strlen(str);
for (int i = len; i >= 0; --i) {
str[i << 1 | 1] = str[i];
str[i << 1] = '$';
}
int id = 0, maxlen = 0;
len = strlen(str);
for (int i = 0; i < len; ++i) {
if (p[id] + id > i) p[i] = min(p[id * 2 - i], p[id] + id - i);
else p[i] = 1;
while (i - p[i] >= 0 && str[i - p[i]] == str[i + p[i]]) ++p[i];
if (p[i] + i > p[id] + id) id = i;
if (maxlen < p[i]) maxlen = p[i];
}
printf("%d\n", maxlen - 1);
}
return 0;
}