manachar算法学习笔记
来源:互联网 发布:联通网络接入点设置 编辑:程序博客网 时间:2024/06/05 11:45
manachar算法用来处理字符串的最长回文子串的算法,其核心就是预处理len数组.
假设原串是s[0...n-1],len[i]表示以s[i]为回文中心的最长回文串的右下标到i的长度,
然后递推瞎搞.
因为算法本身比较简单网上烂大街,主要还是想了一下复杂度.
容易发现Max指针最多扩展到n,而复杂度主要在于while循环,每次都会增加Max指
针或者跳出while循环,所以复杂度最多就是O(n+chang(Max))=O(n).
HDU 3068:点击打开链接
模板题
#include <bits/stdc++.h>using namespace std;#define maxn 111111int len[maxn<<1];char a[maxn];int manachar (char *p) { char s[maxn<<1];//构造新串 int n = strlen (p), l = 0; s[l++] = '@'; s[l++] = '#'; for (int i = 0; i < n; i++) { s[l++] = p[i]; s[l++] = '#'; } s[l++] = '~'; s[l] = 0; //cout << s << endl; int Max = 0, pos = 0, ans = 0; for (int i = 1; i < l; i++) { if (Max > i) { len[i] = min (len[2*pos-i], Max-i); } else len[i] = 1; while (s[i+len[i]] == s[i-len[i]]) len[i]++; ans = max (ans, len[i]); if (len[i]+i > Max) { Max = len[i]+i; pos = i; } } return ans-1;}int main () { while (scanf ("%s", a) == 1) printf ("%d\n", manachar (a)); return 0;}
POJ 3974:点击打开链接
#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <iostream>using namespace std;#define maxn 2211111int len[maxn];char s[maxn];char a[maxn];int Manachar (char *p) { int n = strlen (p), l = 0; s[l++] = '@'; s[l++] = '#'; for (int i = 0; i < n; i++) { s[l++] = p[i]; s[l++] = '#'; } s[l] = 0; int Max = 0, pos = 0, ans = 0; for (int i = 1; i < l; i++) { if (Max > i) { len[i] = min (len[2*pos-i], Max-i); } else len[i] = 1; while (s[i+len[i]] == s[i-len[i]]) len[i]++; ans = max (ans, len[i]); if (len[i]+i > Max) { Max = len[i]+i; pos = i; } } return ans-1;}int main () { int kase = 0; while (scanf ("%s", a) == 1) { if (a[0] == 'E') break; printf ("Case %d: %d\n", ++kase, Manachar (a)); } return 0;}
0 0
- manachar算法学习笔记
- Manachar算法
- Bzoj2084:[Poi2010]Antisymmetry:manachar算法
- 最长回文串(manachar算法)模板
- hdu5371 Hotaru's problem manachar回文串算法+枚举
- hihocoder 1032 最长回文子串(Manachar算法)
- manachar 模板
- manachar模板
- HDU 3068 manachar(马拉车)算法 求最长回文子串
- [算法学习笔记]算法基础知识
- 【算法学习笔记】-排序算法
- 【算法学习笔记】贪心算法
- 算法学习笔记--狄克斯特拉算法
- 算法学习笔记--贪婪算法
- MD5算法学习笔记
- 智能算法学习笔记
- 智能算法学习笔记
- 智能算法学习笔记
- i2c tool 的使用
- lightoj1385 - Kingdom Division
- 通过分析 JDK 源代码研究 Hash 存储机制
- spring-data-solr:第一步.基本po类与schema.xml文件的对应
- MYSQL
- manachar算法学习笔记
- Android中Uri的使用转自http://blog.sina.com.cn/s/blog_821e2bb10100spxv.html
- myeclipse和eclipse中修改Tomcat 的端口
- Android Studio 之常用快捷键及设置
- linux下ping命令使用详解
- stackoverflow一个很好的golang closure example
- Windows网络编程学习笔记(1) 编写一个Winsock基本框架
- ORACLE11g 讨厌的用户验证问题
- java 值传递和引用传递。