如果一个字符串正着读和倒着读是一样的,则称它是回文的。

给定一个长度为N的字符串S,求他的最长回文子串的长度是多少。

输入格式

输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个小写字符的形式给出。

输入以一个以字符串“END”(不包括引号)开头的行表示输入终止。

输出格式

对于输入中的每个测试用例,输出测试用例编号和最大回文子串的长度(参考样例格式)。

每个输出占一行。

输入样例:

abcbabcbabcba
abacacbaaaab
END

输出样例:

Case 1: 13
Case 2: 6
题目:让你找出最长的回文子串 思路:
朴素算法 O(n^2)
枚举中点,然后分奇数长度串,偶数长度串,第二层循环来枚举长度是否可以
哈希做法 O(nlogn),可优化为O(n)
我们知道哈希可以直接判断字符串是否相等,对于回文的情况我们可以正着求一遍哈希,然后反着再求一边哈希,我们就可以判断任意一个区间是否是回文串
只是我们不确定长度,这里我们可以照着上面的思路,枚举中点,然后二分长度,直接判断是否是回文串。
!!!注意,这里不同上面朴素做法的,上面是必须确定前面才能确定后面是否可以,所以长度必须从1开始遍历,所以我们其实可以省去二分,直接每到新的位置,我们直接从当前最大值+1开始枚举,这样
即时O(n)写法
马拉车算法 O(n)
还没学,菜鸡在此告辞 这里给上我写的哈希做法
#include<bits/stdc++.h>
#define maxn 1000005
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
char str[maxn];
ull dp1[maxn],f[maxn];
ull dp2[maxn];
ll len;
void hash_code()
{
memset(f,,sizeof(f));
memset(dp1,,sizeof(dp1));
memset(dp2,,sizeof(dp2));
len=strlen(str+);
f[]=;
for(int i=;i<=len;i++){
dp1[i]=dp1[i-]*+str[i]-'a'+;
f[i]=f[i-]*;
}
for(int i=len;i>=;i--){
dp2[i]=dp2[i+]*+str[i]-'a'+;
}
}
int main(){
ll num=;
while(scanf("%s",str+)!=EOF){
if(strcmp(str+,"END")==) break;
hash_code();
/*int l,r;
while(1)
{
cin>>l>>r;
if(dp1[r]-dp1[l-1]*f[r-l+1]==dp2[l]-dp2[r+1]*f[r-l+1]){
cout<<"YES"<<endl;
}
else cout<<"NO"<<endl;
}*/
ll mx1=,mx2=;
for(int i=;i<=len;i++){
for(int j=mx1+;j<=len;j++){
if(i+j>len||i-j<=) break;
if(dp1[i+j]-dp1[i-j-]*f[*j+]!=dp2[i-j]-dp2[i+j+]*f[*j+]) break;
mx1++;
}
for(int j=mx2+;j<=len;j++){
if(i+j>len||i-j+<=) break;
if(dp1[i+j]-dp1[i-j]*f[*j]!=dp2[i-j+]-dp2[i+j+]*f[*j]) break;
mx2++;
}
//printf("%lld:%lld\n",i,mx1+1);
}
printf("Case %lld: %lld\n",num++,max(*mx1+,*mx2));
}
}

最新文章

  1. IntelliJ IDEA - 热部署插件JRebel 安装使用教程
  2. CDN解决方案
  3. c#-SimHash匹配相似-算法
  4. 一般多项式曲线的最小二乘回归(Linear Regression)
  5. mysql配置mysql-proxy读写分离
  6. (原创)android中使用相机的两种方式
  7. css定位之浮动定位
  8. Non-ASCII characters are not allowed outside of literals and identifiers
  9. tomcat8编码
  10. Linux 磁盘的组成
  11. 手机APP与原生APP设计的区别
  12. 启动python解释器的命令(python manage.py shell和python的区别)
  13. An Easy Problem?! - POJ 2826(求面积)
  14. error LNK2001
  15. jsonp的简单实现
  16. Redis基础学习(五)&mdash;Redis的主从复制
  17. php根据经纬度获取城市名
  18. C#中用ILMerge合并DLL和exe文件成一个exe文件或者DLL
  19. JavaEE学习总结(十四)— 人工智能微博
  20. [转]notepad++ java编码,输出中文字符时,编译出错

热门文章

  1. c#如何写服务,打包和卸载服务
  2. mysql5.7-my.cnf
  3. [六省联考2017]分手是祝愿 题解(期望dp)
  4. leetcode上回溯法的使用
  5. (14)C++ 代码重用
  6. (10)C++ 使用类
  7. SPSS输出的结果都要写到文章中吗
  8. Git 设置和取消代理(SOCKS5代理)
  9. 文件上传&amp;&amp;验证文件格式
  10. 力扣算法——133.CloneGraph【M】