找一个字符串的最长回文字。
manacher模板题
manacher就是往原字符串里面加别的字符,使得得到所有的回文串是奇数的,然后求mp数组,
mp[i]表示以i为中点的最长回文长度
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1000000 + 10;
char a[maxn], ma[maxn*2];
int mp[maxn*2],ans,cas;
void manacher(char a[],int len){
int l = 0;
ma[l++] = '$';
ma[l++] = '#';
for(int i = 0;i<len;i++){
ma[l++] = a[i];
ma[l++] = '#';
}
ma[l] = 0;
int mx = 0,id = 0;
for(int i = 0;i<l;i++){
mp[i] = mx>i ?min(mp[2*id-i],mx-i):1;
while(ma[i+mp[i]] == ma[i-mp[i]]) mp[i]++;
if(i+mp[i]>mx){
mx = i+mp[i];
id = i;
}
}
}
int main(){
while(scanf("%s",a)&&strcmp(a,"END")){
int len = strlen(a);
memset(mp,0,sizeof(mp));
ans = 0;
manacher(a,len);
for(int i = 0;i<2*len+2;i++)
ans = max(ans,mp[i]-1);
printf("Case %d: %d\n",++cas,ans);
}
return 0;
}