Manacher HDOJ 3068 最长回文
关于求解最长回文子串,有dp做法,也有同样n^2的但只用O(1)的空间,还有KMP,后缀数组??
int main(void) {
while (scanf ("%s", str + ) == ) {
int len = strlen (str + );
memset (dp, false, sizeof (dp));
for (int i=; i<=len; ++i) dp[i][i] = true;
for (int i=; i<len; ++i) {
dp[i][i+] = (str[i] == str[i+]);
}
int ans = ;
for (int i=; i<=len; ++i) {
for (int j=; j+i-<=len; ++j) {
if (dp[j+][j+i-] && str[j] == str[j+i-]) {
dp[j][j+i-] = true;
ans = max (ans, i);
}
}
}
printf ("%d\n", ans);
}
return ;
}
n^2
但是n^2的复杂度是过不了3068这题,下面用O(n)的算法解决
waabwswfd
pre: waabwswfd len:
now: $#w#a#a#b#w#s#w#f#d# len:
pi:
maxlen:
例子帮助理解
/*
题意:求最长回文串(不是最长回文子序列)
Manasher:一个好理解,实现方便,O(n)时间复杂的很屌的算法。
简单说一下原理:首先将原字符串每个相邻之间插入一个不可能在字符串出现的字符,这样可以解决奇偶问题
然后p[i]表示以i为回文中心,最长的回文长度(单边),然而在原字符串中ans = max p[i] - 1
我认为算法精髓在于求p[i]时充分利用了回文的性质,跳过了一些无用的扫描。如果不明白上面有例子
详细解释:中文版 英文版 */
/************************************************
* Author :Running_Time
* Created Time :2015-8-7 19:27:46
* File Name :Manacher.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 1e5 + ;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + ;
char s[MAXN], str[MAXN*];
int p[MAXN*]; int Manacher(void) {
str[] = '$'; str[] = '#';
int len = strlen (s);
for (int i=; i<len; ++i) {
str[i*+] = s[i]; str[i*+] = '#';
}
len = len * + ; str[len] = '\0';
int mx = , id = ;
for (int i=; i<len; ++i) {
if (mx > i) p[i] = min (p[*id-i], mx - i);
else p[i] = ;
while (str[i-p[i]] == str[i+p[i]]) p[i]++;
if (mx < p[i] + i) {
mx = p[i] + i; id = i;
}
}
int ret = ;
for (int i=; i<len; ++i) {
ret = max (ret, p[i]);
}
return ret - ;
} int main(void) { //HDOJ 3068 最长回文
while (scanf ("%s", s) == ) {
printf ("%d\n", Manacher ());
} return ;
}
Manacher HDOJ 3068 最长回文的更多相关文章
- hdu 3068 最长回文 manacher算法(视频)
感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...
- HDU - 3068 最长回文(manacher)
HDU - 3068 最长回文 Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Subm ...
- hdu 3068 最长回文(manachar求最长回文子串)
题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...
- hdu 3068 最长回文 manacher
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正 ...
- hdu 3068 最长回文 (Manacher算法求最长回文串)
参考博客:Manacher算法--O(n)回文子串算法 - xuanflyer - 博客频道 - CSDN.NET 从队友那里听来的一个算法,O(N)求得每个中心延伸的回文长度.这个算法好像比较偏门, ...
- hdu 3068 最长回文(manacher&最长回文子串)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- hdu 3068 最长回文【manacher】(模板题)
<题目链接> 最长回文 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如ab ...
- HDU 3068 最长回文( Manacher模板题 )
链接:传送门 思路:Manacher模板题,寻找串中的最长回文子串 /***************************************************************** ...
- hdu 3068 最长回文 【Manacher求最长回文子串,模板题】
欢迎关注__Xiong的博客: http://blog.csdn.net/acmore_xiong?viewmode=list 最长回文 ...
随机推荐
- MT6753 使用nt35596s 由于液晶极化出现的闪屏问题解决思路
咨询屏厂那边FAE , 若是液晶极化相关的问题,下面三种场景下比较容易复现现象,请协助在目前的故障机上做压力测试: 1.反复开关机(1000次), 2.按power键休眠和唤醒(1000次), 3.反 ...
- spring security 5.0 密码未加密报错
使用spring security5.0后,配置文件中直接写普通的密码如:123456,会报错: java.lang.IllegalArgumentException: There is no Pas ...
- ACM组队安排-——杭电校赛(递推)
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #in ...
- Critical Links-UVa796(无向图求桥)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- java常用工具类 - 全角转半角、半角转全角
全角转半角.半角转全角代码 /** * <PRE> * 提供对字符串的全角->半角,半角->全角转换 * codingwhy.com * </PRE> */ pub ...
- C#如何编辑tab选项卡
1 左侧的TabControl 2 如果要添加或删除选项卡个数,则定位到整个TabControl,然后编辑TabPages
- MTK Camera驱动移植
对于MTK Camera驱动移植一般分为四部分: 1.硬件IO口配置: 2.Camera驱动移植: 3.上电时序. 4.改动i2c控制器: 硬件电路: 1.GPIO配置 打开 mediatek\dct ...
- GMT和CST的转换
GMT时间是格林尼治标准时间.CST时间是指包含中国.美国.巴西,澳大利亚四个时区的时间. 在javascript中默认CST是指美国中部时间,倘若在javascript中GMT转换CST则两者相差1 ...
- linux 打包 压缩
序 1.gzip 2.bzip2 3.tar 序 压缩优点 1.节省空间 2.节省带宽 解决脉络 如今有各种压缩文件形式,原因何在?主要是压缩技术更新换代,压缩方法不全然同样.不同的后缀 ...
- LiveWriter高亮显示方法专题
2013年9月26日 花了一上午的时间,熟悉了LiveWriter的用法,学会了怎么配置语法高亮,总结下来. 方法1.用博客园推荐的方法没有成功.pass 方法2 方法来自一个人的旅行.试过O ...