题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089

题意:中文题诶~

思路: 我前面做的那道回文子串的题目是枚举中间字符O(n^2)时间过的,不过这题字符串长度限制为1e5,O(n^2)肯定会超时啦;

有个叫 manacher 的算法是时间复杂度为 O(n), 本题就是 manacher 模板题啦;

我们先看一下 manacher 算法这个东东;

首先回文串匹配奇数长度和偶数长度操作是不一样的, 我们可以在每个字符的两边都加上一个特殊字符 '#', 那么无论原串是长度是奇数还是偶数都会编程奇数长度,并且它的所有回文子串也都变成了奇数长度. 因为对于长度为 len 的字符串 str 我们要使每个字符两边都有一个 '#' 字符,需加 len+1 个 '#' 字符, 那么改变后的字符串 s 长度为 2*lne+1, 其必为奇数;那么现在我们只需要处理奇数的情况了;

我们在用 vis 数组存储以i中心的最大回文串的回文半径(包括 s[i] 字符),那么i对应的原串 str 的回文串长度为 vis[i]-1. 因为str中该回文串长度为 2*vis[i]-1, 其中有 vis[i]个'#'字符嘛, 那么我们只要求出所有 vis[i], 那么答案也就知道了啦;

我们再维护两个变量 id 为当前最长回文子串的中心位置, mx 为其右边界位置;

那么对于当前 i (我们是从前往后求 vis 的, vis[id] 已知, vis[i]未知, 所以 i 一定是在 id 后面的) 我们可以分情况讨论:

对于 mx>i 的情况, 即 i 字符在当前最大回文串里面. 我们可以找到 i 关于 id 的对称位置 j=2*id-i , 若 vis[j] <= mx-i 即以 j 位置为中心的回文串最左端没有超出最大回文串的范围, 即以 j 为中心 和以 i 为中心的最大回文子串都在以 id 为中心的那个回文串里面, 那么由回文串的对称性我们可以知道这两个字符串是一样的, 所以有 vis[i]=vis[j];

如果vis[j] > mx-i, 即以 j 为中心的最大回文子串超出了最大回文子串的范围, 那么 vis[i]>=mx-i, 对于更长的范围就需要我们一个个去匹配了啦;

对于 mx<i 的情况我们并没有什么信息可以利用, 所以需要重新匹配~

代码:

 #include <bits/stdc++.h>
#define MAXN 200010
using namespace std; int main(void){
char s[MAXN], str[MAXN];
int vis[MAXN], j=;
memset(vis, , sizeof(vis));
scanf("%s", str);
for(int i=; str[i]!='\0'; i++){ //在每个字符的两边添加一个特殊字符'#'
s[j++]='#';
s[j++]=str[i];
}
s[j++]='#', vis[]=;
s[j++]='\0';
int len=j-, mx=, id=, ans=; //**id表示当前最大回文子串的中心位置, mx表示当前最大回文子串的最右端位置, ans表示当前已知的最大回文串长度
for(int i=; i<len; i++){
if(mx>i){ //i在当前最大回文串内的情况
vis[i]=min(mx-i, vis[*id-i]);
}else{
vis[i]=;
}
while(s[i-vis[i]]==s[i+vis[i]]&&i>=vis[i]){ //注意边界
vis[i]++; //**匹配没有可利用信息的字符
}
if(vis[i]+i>mx){ //**更新id和mx的值
id=i;
mx=i+vis[i];
}
ans=max(ans, vis[i]); //**更新ans
}
printf("%d\n", ans-);
return ;
}

我们通过代码也可以发现其一直都在往后匹配, 大概可以确定其时间复杂度为O(n)啦~

51nod1089(最长回文子串之manacher算法)的更多相关文章

  1. Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)

    Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...

  2. 最长回文子串的Manacher算法

    对于一个比较长的字符串,O(n^2)的时间复杂度是难以接受的.Can we do better? 先来看看解法2存在的缺陷. 1) 由于回文串长度的奇偶性造成了不同性质的对称轴位置,解法2要对两种情况 ...

  3. 51Nod 1089 最长回文子串 V2 —— Manacher算法

    题目链接:https://vjudge.net/problem/51Nod-1089 1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值:  ...

  4. 求最长回文子串:Manacher算法

    主要学习自:http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 问题描述:回文字符串就是左右 ...

  5. 最长回文子串(Manacher算法)

    回文字符串,想必大家不会不熟悉吧? 回文串会求的吧?暴力一遍O(n^2)很简单,但当字符长度很长时便会TLE,简单,hash+二分搞定,其复杂度约为O(nlogn), 而Manacher算法能够在线性 ...

  6. 计算字符串的最长回文子串 :Manacher算法介绍

    转自: http://www.open-open.com/lib/view/open1419150233417.html Manacher算法 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简 ...

  7. hihocoder #1032 : 最长回文子串【 manacher算法实现 】

    #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  8. 51 Nod 1089 最长回文子串(Manacher算法)

    1089 最长回文子串 V2(Manacher算法)  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaa ...

  9. 图解最长回文子串「Manacher 算法」,基础思路感性上的解析

    问题描述: 给你一个字符串 s,找到 s 中最长的回文子串. 链接:https://leetcode-cn.com/problems/longest-palindromic-substring 「Ma ...

随机推荐

  1. OpenCV图像细化的一个例子

    转自:http://blog.csdn.net/zfdxx369/article/details/9091953?utm_source=tuicool 本文是zhang的一篇经典图像细化论文,效果很好 ...

  2. yii 核心类classes.php详解(持续更新中...)

    classes.php在yii运行的时候将被自动加载,位于yii2文件夹底下. <?php /** * Yii core class map. * * This file is automati ...

  3. BZOJ 4552: [Tjoi2016&Heoi2016]排序

    4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 579  Solved: 322[Sub ...

  4. signalr-源码

    1.一对一聊天 2.多对多 3.离线消息 1)群聊离线 2.1对一聊天离线 源码地址:https://github.com/aa1356889/SignalrCode 操作步骤 部署网站到iis 网上 ...

  5. WPF基础到企业应用系列6——布局全接触

    本文转自:http://knightswarrior.blog.51cto.com/1792698/365351 一. 摘要 首先很高兴这个系列能得到大家的关注和支持,这段时间一直在研究Windows ...

  6. 【Alpha版本】十天冲刺——日志集合贴

    No Bug 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 Day1 Day2 Day3 Day ...

  7. Install Docker on Ubuntu

    Install Docker on Ubuntu Estimated reading time: 17 minutes Docker is supported on these Ubuntu oper ...

  8. php实现转换html格式为文本格式的方法

    有时候需要转换html格式的字符串为文本,但又需要保持一定的格式,比如要求段落变成的分段格式就可以用下面这个函数 function html2text($str){  $str = preg_repl ...

  9. centos ADSL 拨号上网设置

    下面主要介绍一下,在CentOS命令行环境下如何配置 ADSL 联网: 1.确保安装了网卡并能正常运行,使用命令查看一下网卡状态: [root@localhost simon]# /sbin/ifco ...

  10. Java数据结构——图

    点 //类名:Vertex //属性: //方法: class Vertex{ public char label; //点的名称,如A public boolean wasVisited; publ ...