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 ...
随机推荐
- NPOI导出excel表格应用
最近接到一个需求,在原有系统上做二次开发 ,要求导出DataGridView数据到Excel表格中.要求如下: 兼容所有excel版本: 导出后excel各列的样式,字段类型不变. 成型如下:
- TCP协议的三次握手和四次挥手机制
核心知识点: 1.三次握手:seq和ack number 2.四次挥手:FIN和随机数 一.TCP/IP协议 TCP/IP协议(Transmission control protool/Interne ...
- socket()模块和套接字对象的内建方法
一.socket()模块函数 要使用socket.socket()函数来创建套接字,其语法如下: socket(socket_family,socket_type,protocol=0) 如上所述,s ...
- outlook 设置分类收邮件
打开outlook,工具---->“规则和通知”.建相应的规则即可.
- Python 1 的数据类型
Python3 中有六个标准的数据类型: Number(数字)String(字符串)List(列表)Tuple(元组)Sets(集合)Dictionary(字典) 1.Number(数字) pytho ...
- 设计模式之单例模式--instance
<?php header('Content-Type:text/html;charest=utf-8'); /** * 设计模式之单例模式 * $_instance必须声明为静态的私有变量 * ...
- HTML+CSS理解
HTML+CSS1.对WEB标准以及W3C的理解与认识标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外 链css和js脚本.结构行为表现的分离.文件下载与页面速度更快.内容能被更多的用户所 ...
- TIJ读书笔记02-控制执行流程
TIJ读书笔记02-控制执行流程 TIJ读书笔记02-控制执行流程 if-else 迭代 无条件分支 switch语句 所有条件语句都是以条件表达式的真假来决定执行路径,也就是通过布尔测试结果来决 ...
- Linux环境下的图形系统和AMD R600显卡编程(2)——Framebuffer、DRM、EXA和Mesa简介
转:https://www.cnblogs.com/shoemaker/p/linux_graphics02.html 1. Framebuffer Framebuffer驱动提供基本的显示,fram ...
- mysql多表查询原理
转:https://www.cnblogs.com/Toolo/p/3634563.html MySQL的多表查询(笛卡尔积原理) 先确定数据要用到哪些表. 将多个表先通过笛卡尔积变成一个表. 然 ...