Manacher算法教程:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824

模板题,Code 附带注释:
 #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的更多相关文章

  1. Palindrome(poj3974)(manacher算法)

    http://poj.org/problem?id=3974 Palindrome Time Limit: 15000MSMemory Limit: 65536K Total Submissions: ...

  2. POJ3974 Palindrome (manacher算法)

    题目大意就是说在给定的字符串里找出一个长度最大的回文子串. 才开始接触到manacher,不过这个算法的确很强大,这里转载了一篇有关manacher算法的讲解,可以去看看:地址 神器: #includ ...

  3. Palindrome(最长回文串manacher算法)O(n)

     Palindrome Time Limit:15000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  4. Codeforces Beta Round #7 D. Palindrome Degree manacher算法+dp

    题目链接: http://codeforces.com/problemset/problem/7/D D. Palindrome Degree time limit per test1 secondm ...

  5. 利用Manacher算法寻找字符串中的最长回文序列(palindrome)

    寻找字符串中的最长回文序列和所有回文序列(正向和反向一样的序列,如aba,abba等)算是挺早以前提出的算法问题了,最近再刷Leetcode算法题的时候遇到了一个(题目),所以就顺便写下. 如果用正反 ...

  6. POJ 3974 Palindrome 字符串 Manacher算法

    http://poj.org/problem?id=3974 模板题,Manacher算法主要利用了已匹配回文串的对称性,对前面已匹配的回文串进行利用,使时间复杂度从O(n^2)变为O(n). htt ...

  7. POJ3974 Palindrome Manacher 最长回文子串模板

    这道题可以$O(nlogn)$,当然也可以$O(n)$做啦$qwq$ $O(nlogn)$的思路是枚举每个回文中心,通过哈希预处理出前缀和后缀哈希值备用,然后二分回文串的长度,具体的就是判断在长度范围 ...

  8. POJ----(3974 )Palindrome [最长回文串]

    Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 5121   Accepted: 1834 Description Andy ...

  9. hdu 3068 最长回文 manacher算法(视频)

    感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...

随机推荐

  1. javascript 事件绑定

    一.最简单和向后兼容性最好的事件绑定方法是把事件绑定到元素标识的属性.事件属性名称由事件类型外加一个“on”前缀构成.这些属性也被称为事件处理器 <INPUT TYPE="text&q ...

  2. 3.0docker操作

    登录镜像资源 docker login daocloud.io username: password: docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方 ...

  3. Coursera在线学习---第十节.大规模机器学习(Large Scale Machine Learning)

    一.如何学习大规模数据集? 在训练样本集很大的情况下,我们可以先取一小部分样本学习模型,比如m=1000,然后画出对应的学习曲线.如果根据学习曲线发现模型属于高偏差,则应在现有样本上继续调整模型,具体 ...

  4. imx6设备树pinctrl解析【转】

    转自:http://blog.csdn.net/michaelcao1980/article/details/50730421 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在移植linu ...

  5. 图论-单源最短路-SPFA算法

    有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...

  6. Leetcode 之Binary Tree Postorder Traversal(44)

    后序遍历,比先序和中序都要复杂.访问一个结点前,需要先判断其右孩子是否被访问过.如果是,则可以访问该结点:否则,需要先处理右子树. vector<int> postorderTravers ...

  7. Leetcode 之Anagrams(35)

    回文构词法,将字母顺序打乱.可将字母重新排序,若它们相等,则属于同一组anagrams. 可通过hashmap来做,将排序后的字母作为key.注意后面取hashmap值时的做法. vector< ...

  8. Linux非常用命令

    查看系统版本(64位还是32位版本) uname -a 或 more /proc/version 执行结果

  9. hdu 1081(最大子矩阵)

    To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  10. Combination Sum I&&II(经典的回溯算法题)

    I: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C w ...