最长回文字串-manacher算法
来源:互联网 发布:2017最新seo 编辑:程序博客网 时间:2024/06/05 11:41
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int MaxSize = 1001;
#define min(a, b) ((a) < (b) ?(a) : (b));
void Manacher(char *str,int *p)
{
int id;
int mx = 0;
int len = strlen(str);
for(int i = 0;i < len;i++)
{
if(mx > i)
{
p[i] = min(p[2 * id - i],p[mx - i]);
}
else
{
p[i] = 1;
}
for(;(str[p[i] + i] == str[p[i] - i]);p[i]++);
if(p[i] + i > mx)
{
mx = p[i] + i;
id = i;
}
}
}
注:
这是代码中最核心的一句话,它的作用是让我们在以i为中心向左右扩展时,尽量减少重复的比较,当mx > i 时会有两种情况。设j = 2 *id – i 以id为中心i的对称位置。
第一:当以i为中心的回文和以j为中心的回文都在以id为中心的回文中时。
由于回文的对称性,这时p[i]最小为p[j] 这是表达式前半部分。
第二:当以i为中心的回文或以j为中心的回文不在以id为中心的回文中时。
q a b a c a b a c
j id i
或:
c a b a c a b q c
j id i
这时以i为中心的最长回文不一定大于p[i],但是由于回文的对称性,他最小是mx-i(p[j]大时)或p[j]。
0 0
- 最长回文字串-manacher算法
- 最长回文字串(Manacher算法)
- 最长回文字串--Manacher算法
- 最长回文字串--MANACHER算法
- 最长回文字串Manacher 算法
- Manacher算法 求最长回文字串
- Manacher算法求最长回文字串
- 最长回文字串——Manacher算法
- manacher算法求解最长回文字串
- HDU 3068 最长回文(manacher算法:回文字串)
- poj_1974,最长回文字串manacher
- 最长回文字串-Manacher解法
- 算法练习 - 最长回文字串(Manacher 算法学习)
- POJ 3974 最长回文字串(manacher算法)
- 51nod 1089 最长回文字串V2(Manacher算法)
- 最长回文字串 Manacher算法 时间复杂度O(N)
- MANACHER最长回文算法
- 个人模板 Manacher求最长回文字串
- (有坑可复习)poj 1083 Moving Tables 模拟/贪心/技巧性质
- Single Number
- Maximum Depth of Binary Tree
- UITableView实现网格视图效果GridView
- session
- 最长回文字串-manacher算法
- poj 2723 2-SAT
- Reverse Integer
- Java动态生成类以及动态添加属性
- java 测量tool System.nanoTime
- javascript this指针的陷阱
- 了解hbase(一)
- MySQL数据类型详解
- A New Year Gift