题目链接: 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 的情况我们并没有什么信息可以利用, 所以需要重新匹配~

代码:

  1. #include <bits/stdc++.h>
  2. #define MAXN 200010
  3. using namespace std;
  4.  
  5. int main(void){
  6. char s[MAXN], str[MAXN];
  7. int vis[MAXN], j=;
  8. memset(vis, , sizeof(vis));
  9. scanf("%s", str);
  10. for(int i=; str[i]!='\0'; i++){ //在每个字符的两边添加一个特殊字符'#'
  11. s[j++]='#';
  12. s[j++]=str[i];
  13. }
  14. s[j++]='#', vis[]=;
  15. s[j++]='\0';
  16. int len=j-, mx=, id=, ans=; //**id表示当前最大回文子串的中心位置, mx表示当前最大回文子串的最右端位置, ans表示当前已知的最大回文串长度
  17. for(int i=; i<len; i++){
  18. if(mx>i){ //i在当前最大回文串内的情况
  19. vis[i]=min(mx-i, vis[*id-i]);
  20. }else{
  21. vis[i]=;
  22. }
  23. while(s[i-vis[i]]==s[i+vis[i]]&&i>=vis[i]){ //注意边界
  24. vis[i]++; //**匹配没有可利用信息的字符
  25. }
  26. if(vis[i]+i>mx){ //**更新id和mx的值
  27. id=i;
  28. mx=i+vis[i];
  29. }
  30. ans=max(ans, vis[i]); //**更新ans
  31. }
  32. printf("%d\n", ans-);
  33. return ;
  34. }

我们通过代码也可以发现其一直都在往后匹配, 大概可以确定其时间复杂度为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. HTML5属性--(capture="camera") 上传照片或者打开手机相机

    要获取手机相机拍照或者访问相册    这里贴一个相关链接:http://blog.csdn.net/jackfrued/article/details/8967667 JSP页面代码: <inp ...

  2. 走进AngularJs(二) ng模板中常用指令的使用方式

    通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的.ng的模板真是让我爱不释手.学习ng道路还很漫长,从模板 ...

  3. Mysql 命令大全

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root - ...

  4. Xcode真机测试could not find developer disk image解决方法

    原文地址:http://my.oschina.net/u/2340880/blog/521700 Xcode真机测试could not find developer disk image解决方法 在使 ...

  5. BZOJ 2462: [BeiJing2011]矩阵模板

    2462: [BeiJing2011]矩阵模板 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 915  Solved: 432[Submit][Stat ...

  6. oracle---jdbc--laobai

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  7. pycloudtag 标签云

    原创,转载请标明 QQ:231469242 # -*- coding: utf-8 -*- """Python3.0 Created on Sat Nov 26 08:5 ...

  8. Debian 8中dpkg -i自动解决依赖关系

    dpkg -i 后#apt-get update &&apt-get -f install

  9. thinkphp 3.2加载类

    基础方式(自动加载) 控制器: public function ff(){ $t = new \Org\Util\Abc(); echo $t->ss(); } ThinkPHP\Library ...

  10. ecshop 多表删除

    $sql = 'DELETE O, G FROM ' . $GLOBALS['ecs']->table('delivery_order') . ' AS O, ' . $GLOBALS['ecs ...