题意。。。
用传统的方法来做的话,要超时(就是要进行奇偶判断)。
manacher算法,百度一下讲解好的有很多。
纪念粘代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define M 110010
char a[M], b[M<<1];
int p[M<<1];
int main(){
while(~scanf("%s", &a[1])){
//int len = strlen(a);
int i, len;
for(i = 1; a[i] != '\0'; i ++){
b[i<<1] = a[i];
b[(i<<1)+1] = '#';
}
len = (i<<1)+2;
b[0] = '@'; b[1] = '#'; b[len] = 0;
//printf("%d %s.", len, &b[1]);
int maxid, id, max;
maxid = max = id = 0;
for(i = 1; i < len; i ++){
if(maxid > i){
p[i] = min(p[2*id-i], maxid-i);
}
else p[i] = 1;
while(b[i-p[i]] == b[i+p[i]]) ++p[i];
if(maxid < p[i]+i){ //每一次maxid<p[i+i]就将maxid和id更新。
maxid = p[i]+i;
id = i;
}
if(max < p[i]) max = p[i];
//printf("%d..", p[i]);
}
printf("%d\n", max-1);
}
return 0;
}
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3068