最近在暴搞字符串。
poj3974 Palindrome。
数据有点变态的大,10^6,dc3MLE,rmqTLE。
所以Manacher算法O(n)空间和时间求解回文串长还是很有用的嘛。
贴个模板。来自交大书,不用预处理加什么‘#’的,比较方便。记得len[]要开两倍字符串长。
poj3974 Palindrome。
数据有点变态的大,10^6,dc3MLE,rmqTLE。
所以Manacher算法O(n)空间和时间求解回文串长还是很有用的嘛。
贴个模板。来自交大书,不用预处理加什么‘#’的,比较方便。记得len[]要开两倍字符串长。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define Maxn 2001000
char s[Maxn];
int len[Maxn];
int manacher(char str[],int len[],int n){
len[0]=1;
int i,j,p,q,r;
for(i=1,j=0;i<(n<<1)-1;++i){
p=i>>1;q=i-p;r=((j+1)>>1)+len[j]-1;
len[i]=r<q?0:min(r-q+1,len[(j<<1)-i]);
while(p>len[i]-1&&q+len[i]<n&&str[p-len[i]]==str[q+len[i]])
++len[i];
if (q+len[i]-1>r) j=i;
}
int ret=0,tmp;
for(i=0;i<(n<<1)-1;++i){
if (i&1) tmp=len[i]<<1;
else tmp=(len[i]<<1)-1;
if (tmp>ret) ret=tmp;
}
return ret;
}
int main(){
int cas=0;
int ol,tmp,ma,l,i;
while(1){
scanf("%s",s);
if (strcmp(s,"END")==0) break;
l=strlen(s);
ma=manacher(s,len,l);
printf("Case %d: %d\n",++cas,ma);
}
return 0;
}