题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5340

解题思路:首先用manacher处理每个字符,接下来就是要枚举了。

首先是我想到的dp,dp[i][j]表示第i个字符结尾的第j个回文串是否存在。

dp[i+k-1][j] = 1 if(dp[i-k+1][j-1] == 1),k当前表示回文串的半径长度

最后只需要判断dp[len][3]即可。

但很可惜超时了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 20005;
int p[maxn<<1],dp[maxn<<1][4];
char str[maxn],c[maxn];void manacher(int len)
{int id = 0;p[0] = 1;for(int i = 1; i <= 2 * len; i++){if(id + p[id] > i) p[i] = min(p[2*id-i],id + p[id] - i);else p[i] = 1;while(i-p[i]>=0 && i+p[i]<=2*len && c[i-p[i]]==c[i+p[i]]) p[i]++;if(i+p[i] > id+p[id])id = i;}
}int main()
{int t;scanf("%d",&t);while(t--){memset(dp,0,sizeof(dp));scanf("%s",str+1);int len = strlen(str+1);c[0] = '#';for(int i = 1; i <= len; i++){c[2*i-1] = str[i];c[2*i] = '#';}manacher(len);dp[0][0] = 1;for(int i = 1; i < 2 * len; i++)for(int j = 1 + (i % 2 == 0); j <= p[i]; j++)for(int k = 1; k <= 3; k++){if(dp[i - j + 1][k-1])dp[i + j - 1][k] = 1;}if(dp[2*len][3])printf("Yes\n");else printf("No\n");}return 0;
}

其实这里可以枚举第一个串和第三个串的末尾和起始位置,这样就只需要判断中间位置的串是否是回文即可。

#include <cstdio>
#include <algorithm>
#define MAXN 20010
using namespace std;int n;
char d[MAXN];///原始字符串
char st[MAXN*2];///经过manacher处理之后的字符串
int p[MAXN*2];///保存回文串半径,ps每个回文串长度一定为奇数int ll[MAXN*2];///第一个回文串可能的所有半径
int rr[MAXN*2];///第三个回文串可能的所有半径void manacher(){int i;st[0]='$';st[1]='#';for(i=1;d[i]!='\0';++i){st[i*2]=d[i];st[i*2+1]='#';}st[i*2]='\0';n=i*2-1;int MaxId=0,id;for(int i=1;i<=n;i++){if(MaxId>i)p[i]=min(p[2*id-i],MaxId-i);elsep[i]=1;while(st[i+p[i]]==st[i-p[i]])p[i]++;if(p[i]+i>MaxId){id=i;MaxId=p[i]+i;}}
}int main(){int res;scanf("%d",&res);while(res--){scanf("%s",&d[1]);manacher();int l=0,r=0;for(int i=1;i<=n;i++){if(p[i]==i&&i!=1)///p[i]==i保证p[i]可以作为第一个回文串的半径,加入ll数组,i!=1保证第一个回文串不为空ll[l++]=p[i];if(p[i]+i-1==n&&i!=n)///与上面类似rr[r++]=p[i];}int i,j;for(i=l-1;i>=0;--i){for(j=0;j<=r-1;++j){///枚举第一个回文串和第三个回文串int tl=2*ll[i];///第二个字符串的开始位置int tr=n+1-2*rr[j];///第二个字符串的结束位置int tmp=(tl+tr)/2;///第二个字符串的中间位置,ps:这三个字符串都为奇数,可以自己想想if(tl>tr) continue;if(p[tmp]==1) continue;///第二个字符串为"#",也即是在原串中为空if(p[tmp]*2-1>=tr-tl+1)///以tmp为中点的回文串的长度大于等于第二个字符串的长度,符合题意跳出循环break;}if(j<=r-1)break;}if(i>=0)printf("Yes\n");elseprintf("No\n");}return 0;
}

hdu 5340(manacher+枚举)相关推荐

  1. HDU 5371 Manacher Hotaru's problem

    求出一个连续子序列,这个子序列由三部分ABC构成,其中AB是回文串,A和C相同,也就是BC也是回文串. 求这样一个最长的子序列. Manacher算法是在所有两个相邻数字之间插入一个特殊的数字,比如- ...

  2. hdu 44313391 Mahjong 枚举,判断

    hdu 4431 Mahjong 3391也是差不多的题,但是没有字牌应该简单一点. 我说这个题是一个暴力应该没什么问题,就是判断的时候非常麻烦. 题意 说说打的是日本麻将,不过好像中国的麻将也都是这 ...

  3. hdu 5265(二分+枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5265 解题思路: 首先对每个数进行去模,这样得到的数就会是[0,p-1]的范围,接下来就是如何组合的问 ...

  4. hdu 5157(manacher+前缀和+树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5157 解题思路: 我们可以先用mancher算法对字符串进行处理,把以每个点为中心的回文串半径求出来, ...

  5. hdu 4513(manacher+dp)

     吉哥系列故事--完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others ...

  6. hdu 5247(RMQ+枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247 解题思路:这道题要求区间的连续性,可以用RMQ解决.首先可以确定的是如果区间的和必须是满足等差数 ...

  7. The Little Girl who Picks Mushrooms HDU - 4422 (枚举暴力)

    题目描述:5个包,已经有n个包里装了东西,还要继续往剩下的包里装东西(想装多少装多少).返程要经过两个过程,一是要交出3个东西数量之和恰好为1024整数倍的包:二是剩下两个包的东西每次都会被偷1024 ...

  8. 关于manacher

    由一个题引入: 求一个串A的最长回文串: A=abababa 最长回文串长度:5(ababa) 先思考用hash怎么做? 一.暴力 枚举左端,右端点(确定一个区间),线性扫一遍当前区间. Ans=ma ...

  9. HDU 6230 (ManacherBIT)

    HDU 6230 (Manacher&BIT) 依据题意可知,我们需要找到满足两个相交的回文串. 分为几个步骤: 1.求出每个位置的最大回文半径. 2.判断每个位置的贡献. 3.求和. 我们从 ...

最新文章

  1. JAVA多线程Thread VS Runnable详解
  2. webToImage (网页转图片)模块试用分享
  3. python pyside简单布局_python – pyside显示/隐藏布局
  4. linux lnmp分布式集群,LNMP 分布式集群(六):keepalived 高可用方案
  5. 【tensorflow】——创建tensor的方法
  6. 基于 Kubernetes 的微服务部署即代码
  7. python3.7.3 离线安装paramiko_python3和paramiko安装
  8. 怎么用python输入计算公式_如何从python3中的用户输入计算min和max
  9. java io重定向,java中的标准重定向标准IO_java标准IO_java构建器_课课家
  10. 番茄时间--C#实现
  11. 谷歌浏览器任何页面崩溃解决方法
  12. Spring Boot在使用Gradle build命令卡住不动了
  13. 一种基于XGBOOST的企业员工稳定性(员工离职)预测方法
  14. 对微信公众号JS安全域名的理解
  15. 火星坐标系转百度php,PHP版本实现火星,高德地图和百度地图坐标转换
  16. 查验身份证 浙大陈越习题
  17. 计算机网络cidr是啥,计算机网络(4.11)网络层- 无分类编址CIDR
  18. Linux+conda+R+Rstudio下载安装环境全方面配置
  19. daas 数据即服务_什么是daas
  20. MapReducer 取前五的案列Top n

热门文章

  1. 个性化推荐之召回的方法
  2. jenkins+testlink+python搭建自动化测试环境
  3. ES6版Promise实现,给你不一样的体验
  4. thinkphp $this-display()报错
  5. 13.小结Action
  6. 同一个局域网,不同网段的远程控制
  7. lintcode :Partition List 链表划分
  8. android 安全讲座第三层 linux权限基础知识
  9. 如何更加进一步的找到相关的信息呢?
  10. 剑桥大学的组织架构和行政机构:学院高度自制