最长回文
来源:互联网 发布:mac os x输入法切换 编辑:程序博客网 时间:2024/06/02 00:24
最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10222 Accepted Submission(s): 3584
Problem Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaaabab
Sample Output
43
Source
2009 Multi-University Training Contest 16 - Host by NIT
(manacher算法)
他是用于求最大字串长度的
#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int N=110010;char str0[N],str[N*2];int p[N*2];void init(){ int i,l; str[0]='@';str[1]='#';//为str初始化 for(i=0,l=2;str0[i];i++,l+=2)//从第二个开始 { str[l]=str0[i]; str[l+1]='#'; } str[l]='\0';}int solve(){ int ans=0;//结果答案 int i,maxs,id; maxs=0;//p[i]是id的长度maxs=id+p[id]可想而知是id的最右面的坐标值! for(i=1;str[i];i++) { if(maxs>i) { p[i]=min(p[2*id-i],maxs-i);//p[2*id-1]就是求i的对称之后的数(为中心)的回文串长度! } else { p[i]=1; } while(str[i+p[i]]==str[i-p[i]]) { p[i]++; }//继续匹配! if(i+p[i]>maxs) { maxs=i+p[i]; id=i; } if(p[i]>ans) { ans=p[i]; } } return ans-1;}int main(){ int ans; while(cin>>str0) { init(); ans=solve(); cout<<ans<<endl; }}
0 0
- 最长回文
- 最长回文
- 最长回文
- 最长回文
- 最长回文
- 最长回文
- 最长回文
- 最长回文
- 最长回文
- 最长回文
- 最长回文
- 最长回文
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文长度
- 最长回文子串
- 最长回文子串
- 程序员必读书单 1.0
- 1627 - Team them up!
- Leetcode[222]-Count Complete Tree Nodes
- Spring+Mybatis+Velocity配置
- freopen()函数的使用及如何返回控制台。
- 最长回文
- oracle 中oci 关于null 的处理方法
- stringstream中clear()和str(”“)的区别
- MySQL greatest 和 least
- Android Studio个人常用快捷键
- ROS下用gmapping 构建实验室地图的实现
- 常用的OCI函数
- 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
- 中国互联网的11种盈利模式