您的位置:首页 > 其它

关于manacher算法的两个练习题

2012-10-21 13:45 162 查看
HDU3068

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

using namespace std;
char s[320000];
int len[320000];
int max(int a,int b) {return (a>b?a:b);}
int min(int a,int b) {return (a<b?a:b);}

void            manacher(char s[], int len[], int n){
int mx=0,id =1;
for (int i=0,j=0;i< 2*n;++i)
{
len[i]=min(len[2*id-i],mx-i);
for (j=len[i]; (i-j>=0 && i+j+1<2*n) && (s[(i+j+1)/2]==s[(i-j)/2]); j++);
len[i]=j;
if (j+i>mx) mx=j+i,id=i;
}
}
int main()
{
while (scanf("%s\n",s)!=EOF){
scanf("\n");
int n = strlen(s);
manacher(s,len,n);
int ans =0;
for (int i=0;i<2*n;++i){
ans=max(ans,len[i]);
}
cout << ans << endl;
}
return 0;
}


POJ3974

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

using namespace std;
char s[3200000];
int len[3200000];
int max(int a,int b) {return (a>b?a:b);}
int min(int a,int b) {return (a<b?a:b);}

void            manacher(char s[], int len[], int n){
int mx=0,id =1;
for (int i=0,j=0;i< 2*n;++i)
{
len[i]=min(len[2*id-i],mx-i);
for (j=len[i]; (i-j>=0 && i+j+1<2*n) && (s[(i+j+1)/2]==s[(i-j)/2]); j++);
len[i]=j;
if (j+i>mx) mx=j+i,id=i;
}
}
int main()
{
int t=0;
while (scanf("%s\n",s)!=EOF){
if (strcmp(s,"END")==0) break;
t++;
int n = strlen(s);
manacher(s,len,n);
int ans =0;
for (int i=0;i<2*n;++i){
ans=max(ans,len[i]);
}
printf("Case %d: %d\n",t,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: