关于manacher算法的两个练习题
2012-10-21 13:45
162 查看
HDU3068
POJ3974
#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; }
相关文章推荐
- 关于网络程序编写的两个问题
- 关于android布局的两个属性dither和tileMode
- 关于使用cvCalcEMD2计算两个直方图间最小工作距离的限制(Why cvCalcEMD2 Throw Insufficient Memory Exception)
- 关于所写的两个简单sql 循环语句的疑问
- 两个非常重要的关于android frameworks层的ppt
- 关于js的当前日期的格式化,和两个日期之间的相减的天数
- dede关于上传图片失败和无法上传图片的两个错误
- 关于启用Lync Server 2010 SIP账号的两个场景
- 关于.Net安全性的两个小问题
- 关于交换两个整数(不借助第三个临时数)...
- 关于C#中实现两个应用程序消息通讯的问题
- 关于飞信使用两个或多个账号的方法(图)
- 关于一个表关联两个表中之一的注解方式
- 关于Oracle10.2.0自行启动两个监听进程导致服务中断问题
- 关于android创建快捷方式会启动两个应用的问题
- JAVA练习题系列(2 ) 关于for嵌套循环的!最适合初学者!
- geotrellis使用(三十三)关于Geotrellis读取Geotiff的两个细节
- 关于做过的两个项目的总结
- 关于反射的两个棘手问题
- 有必要澄清两个基本概念--算法和过程的关系以及关于程序设计方法论的一些看法