http://acm.hdu.edu.cn/showproblem.php?pid=5340

题意

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

分析

manacher预处理出前缀和后缀回文的位置, 枚举第一个回文串和第三个回文串,这样得到第二个回文串的区间,找中点,因为manacher处理后所有的回文串长度都是奇数,然后根据中点的回文半径判断中间部分是否回文即可, 复杂度o(n2)。至于n2复杂度为什么能水过去。。不是很懂

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<queue>
  5. #include<vector>
  6. #include<cstdio>
  7. #include<algorithm>
  8. #include<map>
  9. #include<set>
  10. #define rep(i,e) for(int i=0;i<(e);i++)
  11. #define rep1(i,e) for(int i=1;i<=(e);i++)
  12. #define repx(i,x,e) for(int i=(x);i<=(e);i++)
  13. #define X first
  14. #define Y second
  15. #define PB push_back
  16. #define MP make_pair
  17. #define mset(var,val) memset(var,val,sizeof(var))
  18. #define scd(a) scanf("%d",&a)
  19. #define scdd(a,b) scanf("%d%d",&a,&b)
  20. #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
  21. #define pd(a) printf("%d\n",a)
  22. #define scl(a) scanf("%lld",&a)
  23. #define scll(a,b) scanf("%lld%lld",&a,&b)
  24. #define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
  25. #define IOS ios::sync_with_stdio(false);cin.tie(0)
  26.  
  27. using namespace std;
  28. typedef long long ll;
  29. template <class T>
  30. void test(T a){cout<<a<<endl;}
  31. template <class T,class T2>
  32. void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
  33. template <class T,class T2,class T3>
  34. void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
  35. const int N = 1e6+;
  36. //const int MAXN = 210;
  37. const int inf = 0x3f3f3f3f;
  38. const ll INF = 0x3f3f3f3f3f3f3f3fll;
  39. const ll mod = ;
  40. int T;
  41. void testcase(){
  42. printf("Case #%d: ",++T);
  43. }
  44. const int MAXN = 4e4+;
  45. const int MAXM = ;
  46. char ma[MAXN],s[MAXN];
  47. int mp[MAXN];
  48. int pre[MAXN],suf[MAXN];
  49. void Manacher(int len){
  50. int l=;
  51. ma[l++]='$';
  52. ma[l++]='#';
  53. for(int i=;i<len;i++) ma[l++]=s[i],ma[l++]='#';
  54. ma[l]=;
  55. int mx=,id=;
  56. for(int i=;i<l;i++){
  57. mp[i]=mx>i?min(mp[*id-i],mx-i):;
  58. while(ma[i+mp[i]]==ma[i-mp[i]]) mp[i]++;
  59. if(i+mp[i]>mx){
  60. mx=i+mp[i];
  61. id=i;
  62. }
  63. }
  64. }
  65. int main() {
  66. #ifdef LOCAL
  67. freopen("in.txt","r",stdin);
  68. #endif // LOCAL
  69. int t;
  70. scd(t);
  71. while(t--){
  72. scanf("%s",s);
  73. int len = strlen(s);
  74. Manacher(len);
  75. int l=,r=;
  76. len=*len+;
  77. for(int i=;i<=len;i++){
  78. if(mp[i]==i&&i!=) pre[l++]=mp[i];
  79. //mp[i]==i保证mp[i]可以作为第一个回文串的半径,加入pre数组,i!=1保证第一个回文串不为空
  80. if(mp[i]+i-==len&&i!=len) suf[r++]=mp[i];
  81. }
  82. int i,j;
  83. for(i=l-;i>=;i--){
  84. for(j=;j<r;j++){
  85. int t1=*pre[i];
  86. int t2=len+-*suf[j];
  87. int tmp = (t1+t2)>>;
  88. if(t1>t2) continue;
  89. if(mp[tmp]==) continue;
  90. if(mp[tmp]*->=t2-t1+) break;
  91. }
  92. if(j<r) break;
  93. }
  94. if(i>=) puts("Yes");
  95. else puts("No");
  96. }
  97. return ;
  98. }

HDU - 5340 Three Palindromes(manacher算法)的更多相关文章

  1. hdu 5340 Three Palindromes

    前几晚 BC 的第二题,官方给出的题解是: 然后我结合昨天刚看的 Manacher 算法试着写了下,发现 pre.suf 数组挺难构造的,调试了好久,然后就对中间进行枚举了,复杂度应该是 O(n2) ...

  2. hdu 3613"Best Reward"(Manacher算法)

    传送门 题意: 国王为了犒劳立下战功的大将军Li,决定奖给Li一串项链,这个项链一共包含26中珠子"a~z",每种珠子都有 相应的价值(-100~100),当某个项链可以构成回文时 ...

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

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

  4. HDU 5340 Three Palindromes (Manacher)

    题意: 判断是否能将字符串S分成三段非空回文串. 思路: 先预处理出前缀回文串和后缀回文串的位置,将位置分别装入两个集合中,O(n). 针对每个前缀回文串的终点位置,挑出不相交的后缀回文串,对中间那段 ...

  5. Manacher 算法(hdu 3068 && hdu 3294)

    今天打算补前晚 BC 的第二题,发现要用到能在 O(n) 时间求最大回文子串长度的 Manacher 算法,第一次听,于是便去百度了下,看了大半天,总算能看懂了其思想,至于他给出的代码模板我没能完全看 ...

  6. hdu 3068 最长回文 manacher算法(视频)

    感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...

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

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

  8. HDU 5371(2015多校7)-Hotaru&#39;s problem(Manacher算法求回文串)

    题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列.该子序列分为三部分,第一部分与第三部分同样,第一部分与第二部分对称.假设存在求最长的符合这样的条件的序列. ...

  9. HDU 3068:最长回文(Manacher算法)

    http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Problem Description   给出一个只由小写英文字符a,b,c...y,z组成的 ...

随机推荐

  1. Resolve Missing artifact Issue in maven

    https://jingyan.baidu.com/article/d621e8da0a5b192864913f79.html

  2. 安装rlwrap 的简单方法

    1. 下载安装 epel包 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 2. 安装r ...

  3. number (1)eclipse 连接数据库报错 数据库信息不对导致的出错

  4. FICO基础知识(四)

    What is the organizational structure for CO? Operating Concern 经营组织 Controlling Area 成本控制范围 Profit c ...

  5. python之设置控制台字体颜色

    # 设置控制台输出字体颜色 # 格式:\033[显示方式;前景色;背景色m # 采用终端默认设置:\033[0m # 红色字体 print('\033[1;31m') print('*' * 10) ...

  6. echarts之简单的入门——【一】做个带时间轴的柱状统计图

    百度Echarts 官网首页  http://echarts.baidu.com/ 配置项手册 http://echarts.baidu.com/option.html#title GL配置项手册 h ...

  7. C# 对象与JSON字符串互相转换的三种方式

    C# 对象与JSON字符串互相转换的三种方式 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. 关于内存对象和JSON字符串的相互转换, ...

  8. Centos7下Zabbix3.4至Zabbix4.0的升级步骤

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Centos7下Zabbix3.4至Zabbix4.0的升级步骤 查看现在centos版本和zab ...

  9. 自学Aruba2.1-Aruba Web UI --Dashbord面板介绍

    点击返回:自学Aruba之路 自学Aruba2.1-Aruba Web UI --Dashbord面板介绍 本文所有设计的的controller版本信息如下:  Aruba7205 V6.4.4.16 ...

  10. [hgoi#2019/2/16t3]psolve

    题目描述 Dustar有n道题目要做.他的月薪是m元. 由于题目是一流的难题,所以Dustar不得不找个人来帮(代)助(替)他写作业. 找人写作业不是免费的,但是他们能保证在一个月内做出任何题目.每做 ...