hdu-3068-最长回文(manacher算法模板)
/*
Name:hdu-3068-最长回文
Copyright:
Author:
Date: 2018/4/24 16:12:45
Description:
manacher算法模板
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <math.h>
#include <algorithm>
using namespace std;
const int MAXN = * ;//字符串长度*2 void manacher(char str[],int len[],int n){//接口
len[] = ;
for(int i = ,j = ; i < (n<<) - ;++ i){
int p = i >> ,q = i - p, r = ((j+) >> ) + len[j] - ;
len[i] = r < q?:min(r-q+,len[(j<<) - i]);
while(p > len[i] - && q + len[i] < n && str[p - len[i]] == str[q+len[i]]) ++len[i];
if(q + len[i] - > r) j = i;
}
}
struct Solution {
string longestPalindrome(string s) {
int n = s.size();
int len[MAXN];
char *str = &s[];
manacher(str,len,n);//调用接口,得到len[]
string tmp = "";
int pos = ,max_len = ;
for(int i = ;i < (n<<) - ; ++ i){
int tmp_len = (i&)?len[i]<<:(len[i]<<)-; //以‘#’or字符为中心,串长不一样
if(tmp_len > max_len) pos = i,max_len = tmp_len; //pos记录目标串的中心点,max_len表示目标串的串长(不含#)
if(i&) tmp+="#"; else tmp+=s[i>>]; //作一个tmp[0..2n-1]的字符串,便于输出
}
if(pos&){ //找到要打印的串tmp的起始位置pos和打印长度max_len(便于打印输出)
max_len = (len[pos] << ) - ;
pos = pos - (len[pos] << ) + ;
}
else{
max_len = (len[pos] << ) - ;
pos = pos - ((len[pos]-)<<);
}
string ans = "";
for(int i = pos,j = ;j < max_len;++ j,++ i){
if(i&) continue;
ans+=tmp[i]; //tmp中找到所要打印的字符,链接起来
}
return ans;
}
}; int main()
{
// freopen("in.txt", "r", stdin);
string str;
while (cin >> str) {
getchar();
Solution tmp;
cout<<tmp.longestPalindrome(str).size()<<endl;
}
return ;
}
hdu-3068-最长回文(manacher算法模板)的更多相关文章
- hdu 3068 最长回文 manacher算法(视频)
感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...
- HDU 3068 最长回文 manacher 算法,基本上是O(n)复杂度
下面有别人的比较详细的解题报告: http://wenku.baidu.com/view/3031d2d3360cba1aa811da42.html 下面贴我的代码,注释在代码中: #include ...
- HDU 3068 最长回文 Manacher算法
Manacher算法是个解决Palindrome问题的O(n)算法,能够说是个超级算法了,秒杀其它一切Palindrome解决方式,包含复杂的后缀数组. 网上非常多解释,最好的解析文章当然是Leetc ...
- HDU - 3068 最长回文manacher马拉车算法
# a # b # b # a # 当我们遇到回判断最长回文字符串问题的时候,若果用暴力的方法来做,就是在字符串中间添加 #,然后遍历每一个字符,找到最长的回文字符串.那么马拉车算法就是在这个基础上进 ...
- hdu 3068 最长回文 manacher
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正 ...
- hdu 3068 最长回文(manacher&最长回文子串)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- hdu 3068 最长回文(manacher入门)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 3068 最长回文子串 马拉车模板
前几天用后缀数组写过一次这题,毫无疑问很感人的TLE了-_-|| 今天偶然发现了马拉车模板,O(N)时间就搞定 reference:http://acm.uestc.edu.cn/bbs/read.p ...
- HDU - 3068 最长回文(manacher)
HDU - 3068 最长回文 Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Subm ...
随机推荐
- 关于 Content-Type:application/x-www-form-urlencoded 和 Content-Type:multipart/related(转)
转至:http://www.cnblogs.com/taoys/archive/2010/12/30/1922186.html application/x-www-form-urlencoded: 窗 ...
- 我的第四个Python小程序
简单的登陆程序: # Author: fansik # Description: Simply log in to small programs # Date: 2017/9/29 _username ...
- C# 学习黑马.Net视频教程,大文件拷贝
设计器代码: namespace 大文件拷贝 { partial class Form1 { /// <summary> /// 必需的设计器变量. /// </summary> ...
- Python与硬件学习笔记:蜂鸣器(转)
相信大家对蜂鸣器都不会陌生,很多产品和方案中都会用到蜂鸣器,大部分都是使用蜂鸣器来做提示或报警,比如按键按下.开始工作.工作结束或是故障等等.这里对单片机在蜂鸣器驱动上的应用作一下描述. 蜂鸣器的介绍 ...
- Swing 添加超链接 打开页面
http://lazycat774880994.iteye.com/blog/567412 Swing中打开一个连接或者web页面的一些记录,这几种方式是在项目中有这样子用到过,特来记录一下,以便下 ...
- python中完善decorator
@decorator可以动态实现函数功能的增加,但是,经过@decorator“改造”后的函数,和原函数相比,除了功能多一点外,有没有其它不同的地方? 在没有decorator的情况下,打印函数名: ...
- CSS3 3D旋转下拉菜单
在线演示 本地下载
- iOS_XML与JSON解析
XML与JSON简介 XML 可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言 易读性高,编码手写难度小,数据量 ...
- Linux 多线程编程实例
一.多线程 VS 多进程 和进程相比,线程有很多优势.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护代码段和数据.而运行于一个进程中的多个线程,他们之间使用相同 ...
- hive -e 时转义需要再加一个\
hive窗口中使用转义字符: select split(concat_ws('|','123','456','789'),'\\|')from dual; 参考 http://jingyan.baid ...