【Manacher算法】poj3974 Palindrome
Manacher算法教程:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char b[],a[];
char tmp[];
int n,f[],zu;//f[i]表示插入一堆#后,以i为中心的最长回文子串の半径长度,
//故其减1后就是原串的最长回文子串的答案
//也是原串中以i为开端的最长回文串の长度。
int id,maxid,ans;
int main()
{
while()
{
scanf("%s",tmp);
if(tmp[]=='E')
break;
zu++;
n=strlen(tmp);
memset(b,,sizeof(b));
memset(a,,sizeof(a));
memset(f,,sizeof(f));
ans=id=maxid=;
for(int i=;i<=n;i++)
b[i]=tmp[i-];
a[]='#';
for(int i=;i<=n;i++)
{
a[i<<]=b[i];
a[i<<|]='#';
}
a[]='-';
a[(n+)<<]='+';
n=n<<|;
f[]=;
id=;//用id这个变量记下取得这个最优maxid时的id值
//即右端扩展到maxid+1时,该回文串中心的位置
maxid=;//maxid是曾经扫描到的回文串中,匹配到的最远的位置+1
for(int i=;i<=n;i++)
{
if(maxid>i)//算法核心:防止重复匹配
f[i]=min(f[(id<<)-i]//以 关于id的对称点 为中心的的最长回文串长
//因为,分别在id两侧的两半回文串是完全一样的
,maxid-i // 但是,以id的对称点为中心的最长回文串有可能超出
//以id为中心的最长回文串的范围,所以,限制其无法超出
//此范围
); //(id<<1)-i 为 i 关于 id 的对称点
else
f[i]=;//否则f[i]=1
for(;a[i+f[i]]==a[i-f[i]];f[i]++);
ans=max(ans,f[i]-);
if(f[i]+i>maxid)//注意是f[i]+i,不是f[i]+i-1,因为maxid是匹配到的最远位置+1
{
maxid=f[i]+i;
id=i;//若以i为中心时,回文串可以扩展到更远的地方,更新id
}
}
printf("Case %d: %d\n",zu,ans);
} return ;
}
【Manacher算法】poj3974 Palindrome的更多相关文章
- Palindrome(poj3974)(manacher算法)
http://poj.org/problem?id=3974 Palindrome Time Limit: 15000MSMemory Limit: 65536K Total Submissions: ...
- POJ3974 Palindrome (manacher算法)
题目大意就是说在给定的字符串里找出一个长度最大的回文子串. 才开始接触到manacher,不过这个算法的确很强大,这里转载了一篇有关manacher算法的讲解,可以去看看:地址 神器: #includ ...
- Palindrome(最长回文串manacher算法)O(n)
Palindrome Time Limit:15000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- Codeforces Beta Round #7 D. Palindrome Degree manacher算法+dp
题目链接: http://codeforces.com/problemset/problem/7/D D. Palindrome Degree time limit per test1 secondm ...
- 利用Manacher算法寻找字符串中的最长回文序列(palindrome)
寻找字符串中的最长回文序列和所有回文序列(正向和反向一样的序列,如aba,abba等)算是挺早以前提出的算法问题了,最近再刷Leetcode算法题的时候遇到了一个(题目),所以就顺便写下. 如果用正反 ...
- POJ 3974 Palindrome 字符串 Manacher算法
http://poj.org/problem?id=3974 模板题,Manacher算法主要利用了已匹配回文串的对称性,对前面已匹配的回文串进行利用,使时间复杂度从O(n^2)变为O(n). htt ...
- POJ3974 Palindrome Manacher 最长回文子串模板
这道题可以$O(nlogn)$,当然也可以$O(n)$做啦$qwq$ $O(nlogn)$的思路是枚举每个回文中心,通过哈希预处理出前缀和后缀哈希值备用,然后二分回文串的长度,具体的就是判断在长度范围 ...
- POJ----(3974 )Palindrome [最长回文串]
Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 5121 Accepted: 1834 Description Andy ...
- hdu 3068 最长回文 manacher算法(视频)
感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...
随机推荐
- Vue 定义组件模板的七种方式(一般用单文件组件更好)
在 Vue 中定义一个组件模板,至少有七种不同的方式(或许还有其它我不知道的方式): 字符串 模板字面量 x-template 内联模板 render 函数 JSF 单文件组件 在这篇文章中,我将通过 ...
- highcharts 从后台动态改变数据
//columnChart 图表对象,创建示例就展示了. var series = this.columnChart.series; whi ...
- linux 3389连接工具Rdesktop
简单使用 工作机换成战斗机了,改用ubuntu,原来的windows7上东西笔记多,还不想重装.用rdesktop来远程连接windows: sudo apt-get install rdesktop ...
- Caffe学习笔记2
Caffe学习笔记2-用一个预训练模型提取特征 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hi ...
- linux-open-source-development-tools【重点】
https://www.pluralsight.com/blog/software-development/linux-open-source-development-tools https://ww ...
- python近期遇到的一些面试问题(二)
1. 解释什么是栈溢出,在什么情况下可能出现. 栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围.在Python中, ...
- 003 CopyOnWriteArrayList原理
聊聊并发-Java中的Copy-On-Write容器 Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候 ...
- C语言比较巧妙的字符串分割程序
在解析字符串时,能够解析的给出每个字符串的长度.内容.以及每个字符串的第一个字符的地址. short i; ; //切割之后的字符串的个数 ,ItemLen[],Idx[], ThCommandLen ...
- pxe+kickstart自动化安装
什么是PXE? PXE(Pre-boot Execution Environment,预启动执行环境)是Intel公司开发的最新技术,工作于Client/Server模式.PXE是一种远程引导方式,要 ...
- [ python ] 项目:haproxy配置文件增删改查
1. 开发要求 实现对 haproxy.cfg 增删改查操作 2. 程序介绍 # 作者:hkey # 博客地址:https://www.cnblogs.com/hukey/p/9288279.html ...