Problem Description
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
Solution
这是manacher的模板题嗯
所谓manacher就是利用回文串对称的性质,减少相同子串的重复运算,然后这东西的复杂度是O(n)的
因为插了一些玄学符号所以数组要开大一倍
Code
#include <stdio.h>
#include <string.h>
#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)
#define fill(x, t) memset(x, t, sizeof(x))
#define min(x, y) (x)<(y)?(x):(y)
#define L 230001
char tmp[L], st[L];
int rad[L];
int main(void){
while (~scanf("%s\n", tmp)){
int len = strlen(tmp);
rep(i, 0, len - 1){
st[i * 2] = '#';
st[i * 2 + 1] = tmp[i];
}
st[len * 2] = '#';
len = len * 2 + 1;
int mx = 0, pos = 0;
int ans = 0;
rep(i, 0, len){
if (i < mx){
rad[i] = min(rad[pos - (i - pos)], mx - i);
}else{
rad[i] = 0;
}
while ((i - rad[i] - 1 > -1) && (i + rad[i] + 1 < len) && st[i - rad[i] - 1] == st[i + rad[i] + 1]){
rad[i] += 1;
}
if (rad[i] + i > mx){
mx = rad[i] + i;
pos = i;
}
if (rad[i] > ans){
ans = rad[i];
}
}
printf("%d\n", ans);
}
return 0;
}