HDU 5340——Three Palindromes——————【manacher处理回文串】
2015-08-11 18:45
260 查看
Three Palindromes
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1244 Accepted Submission(s): 415
[align=left]Problem Description[/align]
Can we divided a given string S into three nonempty palindromes?
[align=left]Input[/align]
First line contains a single integer T≤20 which denotes the number of test cases.
For each test case , there is an single line contains a string S which only consist of lowercase English letters.1≤|s|≤20000
[align=left]Output[/align]
For each case, output the "Yes" or "No" in a single line.
[align=left]Sample Input[/align]
2
abc
abaadada
[align=left]Sample Output[/align]
Yes
No
题目大意:问是否可以找出三段回文串。
题解:
没有进行暴力压位,时间接近超时。但是很侥幸过了。
#include<bits/stdc++.h> using namespace std; #define min(a,b) ((a)<(b)?(a):(b)) const int maxn=20200; int pre[maxn*2],suf[maxn*2]; int p[maxn*2]; char str[maxn],trans[maxn*2]; int Transform(){ // memset(p,0,sizeof(p)); memset(pre,0,sizeof(pre)); memset(suf,0,sizeof(suf)); int len=strlen(str); trans[0]='$'; for(int i=1;i<=2*len;i+=2){ trans[i]='#'; trans[i+1]=str[i/2]; } trans[2*len+1]='#'; trans[2*len+2]='@'; return 2*len+1; } int manacher(){ int len=Transform(); int mx=0,pos=0; for(int i=1;i<=len;i++){ if(i<mx){ p[i]=min(p[2*pos-i],mx-i); }else{ p[i]=1; } for(;trans[i+p[i]]==trans[i-p[i]];p[i]++); if(mx<i+p[i]){ mx=i+p[i]; pos=i; } } return len; } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%s",str); int lens=strlen(str); if(lens<3){ printf("No\n");continue; }else if(lens==3){ printf("Yes\n");continue; }else{ int len= manacher(); for(int i=2;i<len;i++){ if(p[i]==i){ pre[i+p[i]-1]=1; } if(p[i]==len-i+1){ suf[i-p[i]+1]=1; } } int flag=0; for(int i=2;i<len&&(!flag);i++){ for(int j=1;j<p[i]&&(!flag);j++){ if(pre[i-j]&suf[i+j]){ flag=1; printf("Yes\n"); } } } if(!flag){ printf("No\n"); } } } return 0; }
相关文章推荐
- 23.Merge k Sorted Lists (Array, Queue; Sort)
- java 设计模式----工厂模式---待修改
- 单片机流水灯
- 设计模式的分类和六大原则
- 索引基础知识
- HDU 4587 B - TWO NODES tarjan
- Ineligible Devices 不被识别的设备
- 32位和64位系统区别及int字节数
- DFS 事件id 2104 2004 报错
- 给刚玩Hadoop的朋友一些建议
- android 集合架构二-list
- 自定义圆形的ProgressBar
- 黑马程序员———C语言———【一维数组】
- canvas学习之圆周运动
- 数据库MySQL操作
- AJAX实现省市联动
- Java 50道Java线程面试题
- Shell终端下,让svn diff支持颜色高亮
- 话务预测(1) 任务介绍
- new的三种用法