题意:
多行输入,每次给你一个字符串s(|s| <= 1e6),要你求出s中最长回文串的长度。
思路:
manacher板子。
code:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e6 + 5;
char s[maxn], t[maxn * 2];
int lengh[maxn * 2];
int manacher(){
int len = strlen(s);
t[0] = '0';
int cot = 0;
for(int i = 0; i < len; i++){
t[++cot] = '#';
t[++cot] = s[i];
}
t[++cot] = '#';
t[++cot] = '@';
int p = 0, mx = 0;
lengh[0] = 0;
for(int i = 1; i < cot; i++){
if(p + lengh[p] > i) lengh[i] = min(p + lengh[p] - i, lengh[p * 2 - i]);
else lengh[i] = 1;
while(t[i + lengh[i]] == t[i - lengh[i]]) lengh[i]++;
if(p + lengh[p] < i + lengh[i]) p = i;
mx = max(mx, lengh[i]);
}
return mx - 1;
}
int main(){
int cot = 0;
while(scanf("%s", s), s[0] != 'E' && s[1] != 'N' && s[2] != 'D'){
printf("Case %d: %d\n", ++cot, manacher());
}
}