1040. Longest Symmetric String (25)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given "Is PAT&TAP symmetric?", the longest symmetric sub-string is "s PAT&TAP s", hence you must output 11.
Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.
Output Specification:
For each test case, simply print the maximum length in a line.
Sample Input:Is PAT&TAP symmetric?Sample Output:
11
#include <cstdio>
#include <cstring>
const int N = 2020;
int min(const int& a, const int& b) {
return a < b ? a : b;
}
int main() {
char ch;
int len = 0;
int ary[N], p[N] = {0};
while ((ch = getchar()) != EOF) {
ary[len] = -1;
ary[len + 1] = ch;
len += 2;
}
ary[len++] = -2;
int max_len = 0;
int id = 0;
for (int i = 1; i < len; ++i) {
if (id + p[id] > i) p[i] = min(id + p[id] - i, p[id * 2 - i]);
else p[i] = 1;
while (i - p[i] >= 0 && ary[i - p[i]] == ary[i + p[i]]) ++p[i];
if (max_len < p[i]) max_len = p[i];
if (p[id] < p[i]) id = i;
}
printf("%d\n", max_len - 1);
return 0;
}