poj3947最长回文串
2016-04-15 11:33
169 查看
manacher
算法学习http://www.cnblogs.com/pangblog/archive/2013/08/16/3263231.html
http://poj.org/problem?id=3974
模板
算法学习http://www.cnblogs.com/pangblog/archive/2013/08/16/3263231.html
http://poj.org/problem?id=3974
模板
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; typedef long long LL; const int maxn=1000005; char s[maxn],t[maxn<<1]; int Len[maxn<<1]; int init(char *st) { int i,len=strlen(st); t[0]='@';//字符串开头增加一个特殊字符,防止越界 for(i=1;i<=2*len;i+=2) { t[i]='#'; t[i+1]=st[i/2]; } t[2*len+1]='#'; t[2*len+2]='$';//字符串结尾加一个字符,防止越界 t[2*len+3]=0; return 2*len+1;//返回转换字符串的长度 } //Manacher算法计算过程 int manacher(char *st,int len) { int p=0,ans=0,po=0;//mx即为当前计算回文串最右边字符的最大值 for(int i=1;i<=len;i++) { if(p>i) Len[i]=min(p-i,Len[2*po-i]);//在Len[j]和mx-i中取个小 else Len[i]=1;//如果i>=mx,要从头开始匹配 while(st[i-Len[i]]==st[i+Len[i]]) Len[i]++; if(Len[i]+i>p)//若新计算的回文串右端点位置大于mx,要更新po和mx的值 { p=Len[i]+i; po=i; } ans=max(ans,Len[i]); } return ans-1;//返回Len[i]中的最大值-1即为原串的最长回文子串额长度 } int main() { int k=1; while(scanf("%s",s)!=-1) { if(strcmp(s,"END")==0) break; init(s); int len=init(s); int ans=manacher(t,len); printf("Case %d: %d\n",k++,ans); } return 0; }
相关文章推荐
- 代码适配Masonry使用的详细介绍
- android MVC 框架的详解
- Node.js + MongoDB + AngularJS - 1
- inputView与inputAccessoryView的使用,即自定义控件的响应视图
- NodeJS、NPM安装配置步骤
- Eclipse常用快捷键,个人总结
- 产品经理技能之BRD的笔记之菜鸟入门
- Google Map API V3开发(2)
- Google Map API V3开发(1)
- php基于jquery的ajax技术传递json数据简单实例
- iOS UITextFieldDelegate 代理方法小结
- Linux命令之TOP
- [从头学数学] 第178节 平面向量
- 用rz sz命令传输文件
- 每天进步一点点——Linux中的文件描述符与打开文件之间的关系
- SQL-Oracle-创建Dblink
- KindEditor图片批量上传
- gcd多线程
- Hive SQL的编译过程
- 使用Nominatim进行openstreetmap地址搜索/解析