题意:

  判断是否能将字符串S分成三段非空回文串。

思路:

  先预处理出前缀回文串和后缀回文串的位置,将位置分别装入两个集合中,O(n)。

  针对每个前缀回文串的终点位置,挑出不相交的后缀回文串,对中间那段进行暴力匹配即可。只有20个case,不会超时的。

  具体的算法参考HIHOCODER HIHO一下 第一周 #1032 : 最长回文子串 (特殊处理)

  1. //#include <bits/stdc++.h>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <map>
  5. #include <algorithm>
  6. #include <set>
  7. #include <string>
  8. #include <iostream>
  9. #include <deque>
  10. #include <vector>
  11. #define INF 0x7f7f7f7f
  12. #define pii pair<int,int>
  13. #define LL unsigned long long
  14. using namespace std;
  15. const int N=;
  16. int len; //原串长
  17. char str[N*]; //接收原来的串
  18. char s[N*];
  19. int P[N*]; //保存关于长度的信息(回文长度的一半再加1)
  20. vector<int> vect[];
  21. int cal(int q)
  22. {
  23. int id=, mx=, max1=;
  24. P[]=;
  25. P[]=;
  26. for(int i=; s[i]!='\0'; i++) //考虑以i为中心的回文串
  27. {
  28. P[i] =i>mx? : min( P[*id-i],mx-i);
  29. while(s[i+P[i]]==s[i-P[i]]) //在这比对
  30. {
  31. if(i-P[i]==) vect[q].push_back(i+P[i]); //已经匹配
  32. P[i]++;
  33. }
  34.  
  35. if(i+P[i]>mx) //更新id和mx的位置
  36. {
  37. id=i;
  38. mx=i+P[i];
  39. }
  40. if(P[i]->max1) //更新最大值
  41. max1=P[i]-;
  42. }
  43. return max1;
  44. }
  45.  
  46. bool ok()
  47. {
  48. len=strlen(str);
  49. sort(vect[].begin(), vect[].end());
  50. sort(vect[].begin(), vect[].end());
  51.  
  52. for(int i=; i<vect[].size(); i++)//这里虽然穷举了所有可能,但通常都很少
  53. {
  54. for(int j=; j<vect[].size(); j++)
  55. {
  56. int l=vect[][i]+;
  57. int r=len-vect[][j]-;
  58. if(l>r) break;
  59.  
  60. while( l<r && str[l]==str[r] )
  61. l++,r--;
  62. if(l==r && str[l]==str[r])
  63. return true;
  64.  
  65. }
  66. }
  67. return false;
  68. }
  69.  
  70. int main()
  71. {
  72. //freopen("input.txt", "r", stdin);
  73. int t;
  74. cin>>t;
  75. while(t--)
  76. {
  77. scanf("%s",str);
  78. len=strlen(str);
  79. vect[].clear();
  80. vect[].clear();
  81. if(len==)///特别处理
  82. {
  83. puts("YES");
  84. continue;
  85. }
  86.  
  87. s[]='$';
  88. s[]='#';
  89. int i=, j=;
  90. for(; i<len; i++)
  91. {
  92. s[j++]=str[i];
  93. s[j++]='#';
  94. }
  95. s[j]='\0';
  96. strcpy(str,s);//先copy出一份拷贝
  97. memset(P, , sizeof(P));
  98. cal();
  99.  
  100. reverse(s,s+*len+);//反置过来,求后缀回文
  101. s[]='$';
  102. s[*len+]='\0';
  103. memset(P, , sizeof(P));
  104. cal();
  105.  
  106. if(ok())puts("Yes");
  107. else puts("No");
  108. }
  109. return ;
  110. }

AC代码

HDU 5340 Three Palindromes (Manacher)的更多相关文章

  1. HDU - 5340 Three Palindromes(manacher算法)

    http://acm.hdu.edu.cn/showproblem.php?pid=5340 题意 判断是否能将字符串S分成三段非空回文串 分析 manacher预处理出前缀和后缀回文的位置, 枚举第 ...

  2. HDU 5340——Three Palindromes——————【manacher处理回文串】

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

  3. 【SPOJ】NUMOFPAL - Number of Palindromes(Manacher,回文树)

    [SPOJ]NUMOFPAL - Number of Palindromes(Manacher,回文树) 题面 洛谷 求一个串中包含几个回文串 题解 Manacher傻逼题 只是用回文树写写而已.. ...

  4. HDU 5938 Four Operations(四则运算)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  5. HDU 5775 Bubble Sort(冒泡排序)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  6. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  7. HDU 1005 Number Sequence(数列)

    HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...

  8. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  9. HDU 1176 免费馅饼 (动态规划)

    HDU 1176 免费馅饼 (动态规划) Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼 ...

随机推荐

  1. HDU 2669 Romantic(扩展欧几里德, 数学题)

    题目 //第一眼看题目觉得好熟悉,但是还是没想起来//洪湖来写不出来去看了解题报告,发现是裸的 扩展欧几里得 - - /* //扩展欧几里得算法(求 ax+by=gcd )//返回d=gcd(a,b) ...

  2. D&F学数据结构系列——AVL树(平衡二叉树)

    AVL树(带有平衡条件的二叉查找树) 定义:一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树. 为什么要使用AVL树(即为什么要给二叉查找树增加平衡条件),已经在我之前的博文中说到过 ...

  3. 《Thinking in C++》学习笔记(一)【第二章】

    第二章 对象的创建与使用 2.1语言的翻译过程 翻译器分为两类:解释器(interpreter)和编译器(compiler). 2.1.1解释器 解释器将源代码转化成一些动作(它可由许多机器指令组成) ...

  4. [读]剑指offer

    研二的开始找工作了,首先祝愿他们都能够找到自己满意的工作.看着他们的身影,自问明年自己这个时候是否可以从容面对呢?心虚不已,赶紧从老严那儿讨来一本<剑指offer>.在此顺便将自己做题所想 ...

  5. iOS多线程的初步研究(九)-- dispatch源

    dispatch源(dispatch source)和RunLoop源概念上有些类似的地方,而且使用起来更简单.要很好地理解dispatch源,其实把它看成一种特别的生产消费模式.dispatch源好 ...

  6. JS中基本类型与包装类型的关系

    对于JS中一些类型的转化的东西,自己测试并得出的结论,有错误的地方请大大们留言. 不多废话,直接贴代码,测试请直接拷贝全部代码: <!DOCTYPE html> <html> ...

  7. 配置sshd_config中的PermitRootLogin设置root登录或者禁止root登录

    在etc的sshd_config文件中,默认有PermitRootLogin no的配置,这个的意思是禁止root用户登录,如果想要允许root登录,需要su root用户到sshd_config下进 ...

  8. 李洪强iOS开发之多线程编程2-NSOperation

    前言 1.上一讲简单介绍了NSThread的使用,虽然也可以实现多线程编程,但是需要我们去管理线程的生命周期,还要考虑线程同步.加锁问题,造成一些性能上的开销.我们也可以配合使用NSOperation ...

  9. lintcode: 左填充

    题目 实现一个leftpad库,如果不知道什么是leftpad可以看样例 样例 leftpad("foo", 5) >> " foo" leftpa ...

  10. 545C. Woodcutters

    题目链接 题意: n个树,在x1,x2,...,xn的位置,树的高度依次是h1,h2,...,hn 求的是当把树砍倒时候,不占用相邻树的位置,最大砍树个数 可向左 向右砍,即树向左向右倒,很显然 当树 ...