Manacher模版

求字符串中出现过的最长回文子串

[cpp] view plaincopy

  1. const int MAXN = 110010;
  2. //字符串长度<MAXN
  3. char Ma[MAXN * 2];
  4. int Mp[MAXN * 2];
  5. int Manacher(char s[]) {
  6. int l = 0, len = strlen(s);
  7. Ma[l++] = ‘$‘;
  8. Ma[l++] = ‘#‘;
  9. for (int i = 0; i<len; i++)  {
  10. Ma[l++] = s[i];
  11. Ma[l++] = ‘#‘;
  12. }
  13. Ma[l] = 0;
  14. int mx = 0, id = 0;
  15. for (int i = 0; i<l; i++)  {
  16. Mp[i] = mx>i ? min(Mp[2 * id - i], mx - i) : 1;
  17. while (Ma[i + Mp[i]] == Ma[i - Mp[i]])Mp[i]++;
  18. if (i + Mp[i]>mx)   {
  19. mx = i + Mp[i];    id = i;
  20. }
  21. }
  22. int ans = 0;
  23. for (int i = 0; i<2 * len + 2; i++)
  24. ans = max(ans, Mp[i] - 1);
  25. return ans;
  26. }
时间: 2024-08-05 11:18:43

Manacher模版的相关文章

Hdu 3068 最长回文(Manacher模版题)

#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int N=220010; using namespace std; char str[N]; char tmp[N]; int len[N]; int init(){ tmp[0]='$'; int i=0,nlen=1; while(str[i]!='\0'){ tmp[nlen++]='#'; tmp[n

Ural 1297 Palindrome(Manacher或者后缀数组+RMQ-ST)

1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The “U.S. Robots” HQ has just received a rather alarming anonymous letter. It states that the agent from the competing «Robots Unlimited» has infiltrated into “U.S. Robotics”. «U.S. Robots»

HDU 3068 最长回文(初遇manacher)

这题可用拓展KMP分治法来做http://blog.sina.cn/dpool/blog/s/blog_677a3eb30100knj8.html 复杂度O(nlogn)这种方法好复杂而且代码很长,不易理解. 相比之下Manacher就简单多了,算法本身也很简单 这里个易懂的资料http://wenku.baidu.com/view/3031d2d3360cba1aa811da42.html 复杂度O(n) kuangbin的模版(有一处修改) /* * 求最长回文子串 */ const int

Manacher详解

之前的字符串题解中对Manacher的思想进行了简略的介绍,在这篇文章中,我将会详细的将这个算法的初衷和具体实现理论进行解释.声明一点,这是我个人的理解,可能有不全面之处,望多包涵.在之前的几篇文章中,我也发现有个别的编辑错误,希望大家在看的时候多加思考,不要被我的思维禁锢. 可能有的人没有看过之前的文章,那么我再赘述几句. 回文串:以最中间一个字符或者中轴线为对称轴左右两侧镜像相等的字符串. 例如 : 123321 这个字符串前三个字符和后三个字符镜像相等 1234321 这个字符串 前四个字

KMP &amp; 扩展KMP &amp; Manacher 专题

KMP & 扩展KMP & Manacher  专题 先来模版: void getNext(int *b,int m) { Next[0]=-1; int i=0,j=-1; while(i<m&&j<m){ if(j==-1||b[i]==b[j]) Next[++i]=++j; else j=Next[j]; } } int kmp(int *a,int *b,int n,int m) { getNext(b,m); int i=0,j=0; while(i

BZOJ 2084 [Poi2010]Antisymmetry(manacher)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2084 [题目大意] 对于一个01字符串,如果将这个字符串0和1取反后, 再将整个串反过来和原串一样,就称作“反对称”字符串. 比如00001111和010101就是反对称的,1001就不是. 现在给出一个长度为N的01字符串,求它有多少个子串是反对称的. [题解] 修改manacher的判定条件,对该串进行计算即可. [代码] #include <cstdio> #include

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

HDU 3068 最长回文 (manacher算法)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9188    Accepted Submission(s): 3159 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

zabbix导入模版问题解决办法

当我们监控一些东西需要使用zabbix模版的时候,而模版没有怎么办?最简单的方法就是导入模版了 模版可以去https://www.zabbix.org/wiki/Zabbix_Templates/Official_Templates这里下载 而在导入的时候会报一些错误,下面给出导入vmware template报错的解决办法: 首先检查zabbix中是不是有模版对应的value map,没有的话导入的时候就报错啦. 手工创建value map: zabbix:在Administrator->ge