Description
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.
字符串长度为n
一行小写英文字符a,b,c…y,z组成的字符串S
Output
一个整数表示答案
Data Constraint
字符串长度len <= 11000000
Solution
manacher裸题,纯粹找手感
Code
#include <stdio.h>
#include <string.h>
#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)
#define min(x, y) (x)<(y)?(x):(y)
#define max(x, y) (x)>(y)?(x):(y)
#define L 22000003
int rad[L];
char rd[L],
str[L];
int main(
void){
scanf(
"%s", rd);
int len = strlen(rd);
str[
0] =
'#';
rep(i,
0, len -
1){
str[i *
2 +
1] = rd[i];
str[i *
2 +
2] =
'#';
}
len = len *
2 +
1;
int pos =
0, mx =
0;
int ans =
0;
rep(i,
0, len){
rad[i] =
0;
if (i < mx){
rad[i] = min(rad[pos - (i - pos)], mx - i);
}
while (i + rad[i] +
1 < len && i - rad[i] > &&
str[i + rad[i] +
1] ==
str[i - rad[i] -
1]){
rad[i] +=
1;
}
if (rad[i] + i > mx){
mx = rad[i] + i;
pos = i;
}
ans = max(ans, rad[i]);
}
printf(
"%d\n", ans);
return 0;
}