题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068
题目大意:求给定字符串的最长回文子串
分析:马拉车模板题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 110010;
int len, p[2 * N];
char s[N], str[2 * N];
void init() {
len = strlen(s);
int k = 0;
str[k++] = '$';
for(int i = 0; i < len; i++) {
str[k++] = '#';
str[k++] = s[i];
}
str[k++] = '#';
len = k;
}
int manacher() {
int sum = 0, mx = 0, id;
for(int i = 1; i < len; i++) {
if(i < mx) p[i] = min(mx - i, p[2 * id - i]);
else p[i] = 1;
while(str[i - p[i]] == str[i + p[i]]) p[i]++;
if(p[i] + i > mx) {
mx = p[i] + i;
id = i;
}
sum = max(sum, p[i] - 1);
}
return sum;
}
int main() {
while(~scanf("%s", s)) {
init();
printf("%d\n", manacher());
}
return 0;
}