题目链接

 /*
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算法模板)的更多相关文章

  1. hdu 3068 最长回文 manacher算法(视频)

    感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...

  2. HDU 3068 最长回文 manacher 算法,基本上是O(n)复杂度

    下面有别人的比较详细的解题报告: http://wenku.baidu.com/view/3031d2d3360cba1aa811da42.html 下面贴我的代码,注释在代码中: #include ...

  3. HDU 3068 最长回文 Manacher算法

    Manacher算法是个解决Palindrome问题的O(n)算法,能够说是个超级算法了,秒杀其它一切Palindrome解决方式,包含复杂的后缀数组. 网上非常多解释,最好的解析文章当然是Leetc ...

  4. HDU - 3068 最长回文manacher马拉车算法

    # a # b # b # a # 当我们遇到回判断最长回文字符串问题的时候,若果用暴力的方法来做,就是在字符串中间添加 #,然后遍历每一个字符,找到最长的回文字符串.那么马拉车算法就是在这个基础上进 ...

  5. hdu 3068 最长回文 manacher

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正 ...

  6. hdu 3068 最长回文(manacher&amp;最长回文子串)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. hdu 3068 最长回文(manacher入门)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. hdu 3068 最长回文子串 马拉车模板

    前几天用后缀数组写过一次这题,毫无疑问很感人的TLE了-_-|| 今天偶然发现了马拉车模板,O(N)时间就搞定 reference:http://acm.uestc.edu.cn/bbs/read.p ...

  9. HDU - 3068 最长回文(manacher)

    HDU - 3068 最长回文 Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Subm ...

随机推荐

  1. NPOI导出excel表格应用

    最近接到一个需求,在原有系统上做二次开发 ,要求导出DataGridView数据到Excel表格中.要求如下: 兼容所有excel版本: 导出后excel各列的样式,字段类型不变. 成型如下:

  2. TCP协议的三次握手和四次挥手机制

    核心知识点: 1.三次握手:seq和ack number 2.四次挥手:FIN和随机数 一.TCP/IP协议 TCP/IP协议(Transmission control protool/Interne ...

  3. socket()模块和套接字对象的内建方法

    一.socket()模块函数 要使用socket.socket()函数来创建套接字,其语法如下: socket(socket_family,socket_type,protocol=0) 如上所述,s ...

  4. outlook 设置分类收邮件

    打开outlook,工具---->“规则和通知”.建相应的规则即可.

  5. Python 1 的数据类型

    Python3 中有六个标准的数据类型: Number(数字)String(字符串)List(列表)Tuple(元组)Sets(集合)Dictionary(字典) 1.Number(数字) pytho ...

  6. 设计模式之单例模式--instance

    <?php header('Content-Type:text/html;charest=utf-8'); /** * 设计模式之单例模式 * $_instance必须声明为静态的私有变量 * ...

  7. HTML+CSS理解

    HTML+CSS1.对WEB标准以及W3C的理解与认识标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外 链css和js脚本.结构行为表现的分离.文件下载与页面速度更快.内容能被更多的用户所 ...

  8. TIJ读书笔记02-控制执行流程

      TIJ读书笔记02-控制执行流程 TIJ读书笔记02-控制执行流程 if-else 迭代 无条件分支 switch语句 所有条件语句都是以条件表达式的真假来决定执行路径,也就是通过布尔测试结果来决 ...

  9. Linux环境下的图形系统和AMD R600显卡编程(2)——Framebuffer、DRM、EXA和Mesa简介

    转:https://www.cnblogs.com/shoemaker/p/linux_graphics02.html 1. Framebuffer Framebuffer驱动提供基本的显示,fram ...

  10. mysql多表查询原理

    转:https://www.cnblogs.com/Toolo/p/3634563.html MySQL的多表查询(笛卡尔积原理)   先确定数据要用到哪些表. 将多个表先通过笛卡尔积变成一个表. 然 ...