hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )
2016-05-01 11:31
337 查看
#1032 : 最长回文子串
时间限制:1000ms单点时限:1000ms
内存限制:64MB
描述
小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?”
小Ho奇怪的问道:“什么叫做最长回文子串呢?”
小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串指的是12421这种从前往后读和从后往前读一模一样的字符串,所以最长回文子串的意思就是这个字符串中最长的身为回文串的子串啦~”
小Ho道:“原来如此!那么我该怎么得到这些字符串呢?我又应该怎么告诉你我所计算出的最长回文子串呢?
小Hi笑着说道:“这个很容易啦,你只需要写一个程序,先从标准输入读取一个整数N(N<=30),代表我给你的字符串的个数,然后接下来的就是我要给你的那N个字符串(字符串长度<=10^6)啦。而你要告诉我你的答案的话,只要将你计算出的最长回文子串的长度按照我给你的顺序依次输出到标准输出就可以了!你看这就是一个例子。”
提示一 提示二 提示三 提示四
样例输入
3 abababa aaaabaa acacdas
样例输出
7 53
看了一上午 像我只懂那些暴力的解法 对一些高明的算法却一点都不清楚 唯有慢慢学习 唉
处理最长回文串的算法manacher 在Manacher's
ALGORITHM: O(n)时间求字符串的最长回文子串
里看懂了一点大概
慢慢理解 先把题ac了
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
char str1[1000005];
char str[1000005*2];
int p[1000005*2];
int manacher()
{
int id=0,mx=0;
int max=1;
for(int i=0;str[i]!='\0';i++)
{
p[i]=mx>i?min(p[2*id-i],mx-i):1;
while(str[i+p[i]]==str[i-p[i]]) p[i]++;
if(i+p[i]>mx)
{
mx=i+p[i];
id=i;
}
if(p[i]>max)
max=p[i];
}
return max-1;
}
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
memset(str1,0,sizeof(str1));
memset(str,0,sizeof(str));
memset(p,0,sizeof(p));
scanf("%s",str1);
int j=2;
str[0]='_';//避免越界
str[1]='@';
for(int i=0;str1[i]!='\0';i++)
{
str[j++]=str1[i];
str[j++]='@';
}
str[j]='\0';
printf("%d\n",manacher());
}
return 0;
}
相关文章推荐
- Cordova页面加载外网图片失败,Refused to load the image
- Android Studio Subversion 版本异常报错
- HttpClient用于https交互
- 【一天一道LeetCode】#34. Search for a Range
- 【一天一道LeetCode】#34. Search for a Range
- 用同文输入法,实现五笔双键布局
- 让一个平淡无奇的网站盈利你需要这五个主意
- iOS下使用FFMPEG
- [系统运维]进程的守护神 - Supervisor
- bat判断window服务是否存在
- [C++]实现--讨论关于实现中可能出现的问题
- C# winform中DataGridView最常用的知识点
- ArchLinux 升级导致的wifi故障
- 剑指offer----用两个队列实现一个栈(java代码)
- Windows10下80端口被PID为4的System占用导致Apache无法启动的分析
- HBase分布式安装配置图文详解
- 解决移动端a标签点击有边框问题
- J2EE环境搭建(二)安装Eclipse插件和第一个Eclipse项目
- SPFA队列模板
- HDU2037------贪心算法排序