题目信息
1040. Longest Symmetric String (25)
时间限制400 ms
内存限制65536 kB
代码长度限制16000 B
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
解题思路
manacher算法,不懂的可参照我的另一篇博文:http://blog.csdn.net/xianyun2009/article/details/46767829
AC代码
#include <cstdio>
#include <algorithm>
using namespace std;
char s[2010];
int r[2010];
int ch, p = 0;
int manacher(){
int cn = 0, mx = 0, re = 0;
for (int i = 1; i < p; ++i){
r[i] = (mx > i) ? min(r[cn * 2 - i], mx - i) : 1;
while (s[i + r[i]] == s[i - r[i]]) ++r[i];
if (i + r[i] > mx){
mx = i + r[i];
cn = i;
}
if (r[i] > re) re = r[i];
}
return re - 1;
}
int main()
{
s[p++] = '\1'; //特殊字符
while ((ch = getchar()) && ch != '\n'){
s[p++] = '\3';
s[p++] = ch;
}
s[p++] = '\3';
printf("%d\n", manacher());
return 0;
}