题意:

  判断是否能将字符串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. Java 并发同步器之CountDownLatch、CyclicBarrier

    一.简介 1.CountDownLatch是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞 ...

  2. iOS后台运行

    http://www.cocoachina.com/bbs/read.php?tid=149564 文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后 ...

  3. POJ 2080

    import java.util.*; public class Main { public static void main(String args[]){ Scanner cin=new Scan ...

  4. Android中的Adapter总结

    一.Adapter的介绍 An Adapter object acts as a bridge between an AdapterView and the underlying data for t ...

  5. hdu 4559 涂色游戏(对SG函数的深入理解,推导打SG表)

    提议分析: 1 <= N <= 4747 很明显应该不会有规律的,打表发现真没有 按题意应该分成两种情况考虑,然后求其异或(SG函数性质) (1)找出单独的一个(一列中只有一个) (2)找 ...

  6. 用httpPost对JSON发送和接收的例子

    HTTPPost发送JSON: private static final String APPLICATION_JSON = "application/json";         ...

  7. Android中级之网络数据解析一之xml解析

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! --Comic Sans MS Xml解析具有跨平台性,语言无关性,易操作性,因此广受开发者的欢迎. ...

  8. WPF之快速实现拖拽功能

    场景:工具栏上有很多图标(一个图标代表一种控件),可以左键按下图标,然后拖拽到设计区域创建一个个的控件. 实现:1.给工具栏上的图标添加MouseLeftDown和MouseMove事件,前者事件是为 ...

  9. Ubuntu LAMP搭建

    为了数据库课程设计,只好自己搭一个数据库系统,采用LAMP方式. 一.安装 1.安装Apache sudo apt-get install apache2 Apache在安装期间会新建一个目录:/va ...

  10. Ubuntu安装取色软件

    sudo apt-get install Gpick