题目描写叙述:

  1. 推断能否将字符串S分成三段非空回文串。

解题思路:

源码:

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define MAXN 20010
  4. using namespace std;
  5.  
  6. int n;
  7. char d[MAXN];///原始字符串
  8. char st[MAXN*2];///经过manacher处理之后的字符串
  9. int p[MAXN*2];///保存回文串半径,ps每一个回文串长度一定为奇数
  10.  
  11. int ll[MAXN*2];///第一个回文串可能的全部半径
  12. int rr[MAXN*2];///第三个回文串可能的全部半径
  13.  
  14. void manacher(){///manacher算法,能够去查询了解一下
  15. int i;
  16. st[0]='$';
  17. st[1]='#';
  18. for(i=1;d[i]!='\0';++i){
  19. st[i*2]=d[i];
  20. st[i*2+1]='#';
  21. }
  22. st[i*2]='\0';
  23. n=i*2-1;
  24. int MaxId=0,id;
  25. for(int i=1;i<=n;i++)
  26. {
  27. if(MaxId>i)
  28. p[i]=min(p[2*id-i],MaxId-i);
  29. else
  30. p[i]=1;
  31. while(st[i+p[i]]==st[i-p[i]])
  32. p[i]++;
  33. if(p[i]+i>MaxId){
  34. id=i;
  35. MaxId=p[i]+i;
  36. }
  37. }
  38. }
  39.  
  40. int main(){
  41. int res;
  42. scanf("%d",&res);
  43. while(res--){
  44. scanf("%s",&d[1]);
  45. manacher();
  46. int l=0,r=0;
  47. for(int i=1;i<=n;i++){
  48. if(p[i]==i&&i!=1)///p[i]==i保证p[i]能够作为第一个回文串的半径,增加ll数组,i!=1保证第一个回文串不为空
  49. ll[l++]=p[i];
  50. if(p[i]+i-1==n&&i!=n)///与上面相似
  51. rr[r++]=p[i];
  52. }
  53. int i,j;
  54. for(i=l-1;i>=0;--i){
  55. for(j=0;j<=r-1;++j){///枚举第一个回文串和第三个回文串
  56. int tl=2*ll[i];///第二个字符串的開始位置
  57. int tr=n+1-2*rr[j];///第二个字符串的结束位置
  58. int tmp=(tl+tr)/2;///第二个字符串的中间位置,ps:这三个字符串都为奇数,能够自己想想
  59. if(tl>tr) continue;
  60. if(p[tmp]==1) continue;///第二个字符串为"#",也即是在原串中为空
  61. if(p[tmp]*2-1>=tr-tl+1)///以tmp为中点的回文串的长度大于等于第二个字符串的长度,符合题意跳出循环
  62. break;
  63. }
  64. if(j<=r-1)
  65. break;
  66. }
  67. if(i>=0)
  68. printf("Yes\n");
  69. else
  70. printf("No\n");
  71. }
  72. return 0;
  73. }

hdu5340 Three Palindromes(manacher算法)的更多相关文章

  1. hdu5340—Three Palindromes—(Manacher算法)——回文子串

    Three Palindromes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  2. UVA 11584 Partitioning by Palindromes 划分回文串 (Manacher算法)

    d[i]表示前面i个字符划分成的最小回文串个数, 转移:当第i字符加进来和前面区间j构成回文串,那么d[i] = d[j]+1. 要判断前面的字符j+1到i是不是回文串,可以用Manacher算法预处 ...

  3. manacher算法专题

    一.模板 算法解析:http://www.felix021.com/blog/read.php?2040 *主要用来解决一个字符串中最长回文串的长度,在O(n)时间内,线性复杂度下,求出以每个字符串为 ...

  4. Codeforces Beta Round #7 D. Palindrome Degree manacher算法+dp

    题目链接: http://codeforces.com/problemset/problem/7/D D. Palindrome Degree time limit per test1 secondm ...

  5. KMP 、扩展KMP、Manacher算法 总结

    一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...

  6. Hash 算法与 Manacher 算法

    目录 前言 简单介绍 简述 Hash 冲突 离散化 基本结构 普通 Hash 简述 例题 字符串 Hash 简单介绍 核心思想 基本运算 二维字符串 Hash 例题 兔子与兔子 回文子串的最大长度 后 ...

  7. HDU3068 回文串 Manacher算法

    好久没有刷题了,虽然参加过ACM,但是始终没有融会贯通,没有学个彻底.我干啥都是半吊子,一瓶子不满半瓶子晃荡. 就连简单的Manacher算法我也没有刷过,常常为岁月蹉跎而感到后悔. 问题描述 给定一 ...

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

    题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...

  9. 1089 最长回文子串 V2(Manacher算法)

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

随机推荐

  1. ant 入门级详解

    ant 入门级详解   [转载的地址(也是转载,未找到原文地址)]https://www.cnblogs.com/jsfx/p/6233645.html 1,什么是antant是构建工具2,什么是构建 ...

  2. wordpress 使用wp_head()函数

    wp_head()的作用: 在WordPress主题中使用此函数控制<head>…</head>之间的标签内容. 以通过header.php模板文件输出html中的head标签 ...

  3. cobbler常用目录/命令(三)

    常用目录: /var/www/cobbler/ks_mirror/                cobbler distro文件目录 /var/lib/tftpboot/pxelinux.cfg/d ...

  4. Linux Shell系列教程之(五)Shell字符串

    本文是Linux Shell系列教程的第(五)篇,更多shell教程请看:Linux Shell系列教程 字符串是Shell编程中最常用最有用的数据类型,今天,Linux大学网就为大家介绍一下在She ...

  5. 【Luogu】P2303Longge的问题(莫比乌斯反演)

    就让我这样的蒟蒻发一个简单易想的题解吧!!! 这题我一开始一看,woc这不是莫比乌斯反演么,推推推,推到杜教筛,输出结果一看不对 emmm回来仔细想想……woc推错了? 然后撕烤半天打了个暴力,A了 ...

  6. 【Luogu】P2765魔术球问题(没看懂的乱搞)

    题目链接 这题……讲道理我没看懂. 不过我看懂题解的代码是在干嘛了qwq 题解是zhaoyifan的题解 然后……我来讲讲这个题解好了. 题解把值为i的球拆成了两个,一个编号是i*2,一个编号是i*2 ...

  7. scale out instead of scale up

    Scale Out(也就是Scale horizontally)横向扩展,向外扩展Scale Up(也就是Scale vertically)纵向扩展,向上扩展无论是Scale Out,Scale Up ...

  8. 机器人程序设计——之如何正确入门ROS | 硬创公开课(附视频/PPT)【转】

    转自:http://blog.exbot.net/archives/2966 导语:本期公开课面向想入手ROS却又不知从何下手的小伙伴,为大家梳理好学习思路. ROS和Android一样是开源的,功能 ...

  9. Scrapy学习-19-远程管理telnet功能

    使用scrapy的telnet功能远程管理scrapy运行 用法 telnet <IP_ADDR> <PORT> 官方文档 https://doc.scrapy.org/en/ ...

  10. [List] C#数组学习

    数组概述 C# 数组从零开始建立索引,即数组索引从零开始.C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似.但还有一些差异应引起注意.声明数组时,方括号 ([]) 必须跟在类型后面,而不是 ...