hdu--5311

来源:互联网 发布:php 0字节截断 编辑:程序博客网 时间:2024/06/05 02:39

Hidden String

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1705    Accepted Submission(s): 600


Problem Description
Today is the 1st anniversary of BestCoder. Soda, the contest manager, gets a string s of length n. He wants to find three nonoverlapping substrings s[l1..r1]s[l2..r2]s[l3..r3] that:

1. 1l1r1<l2r2<l3r3n

2. The concatenation of s[l1..r1]s[l2..r2]s[l3..r3] is "anniversary".
 

Input
There are multiple test cases. The first line of input contains an integer T (1T100), indicating the number of test cases. For each test case:

There's a line containing a string s (1|s|100) consisting of lowercase English letters.
 

Output
For each test case, output "YES" (without the quotes) if Soda can find such thress substrings, otherwise output "NO" (without the quotes).
 

Sample Input
2annivddfdersewwefarynniversarya
 

Sample Output
YESNO
解题思路:这道题wa了6遍,后来改着改者就过了,表示递归好难,还是有点模糊.大哭只是大概理解
代码如下:
#include<stdio.h>#include<string.h>char a[]={"anniversary"};char s[110];int la,ls;bool flag;bool dfs(int nows,int nowa,int sum){int i,j,k;if(sum>3)return false;if(flag)return true;for(k=0,i=0;i+nows<ls&&i+nowa<la;i++){if(s[nows+i]!=a[nowa+k]){for(j=nows+i+1;j<ls;j++){if(s[j]==a[nowa+k]){flag=dfs(j,nowa+k,sum+1);    if(flag)return true;}}return false;//这一句,wa了三遍.* }else k++;}//if(nowa==la-1&&sum<=3)if(nowa+k==la&&sum<=3)return true;else return false;}int main(){int t;scanf("%d",&t);while(t--){flag=false;scanf("%s",s);ls=strlen(s);la=strlen(a);if(ls<la){printf("NO\n");continue;}for(int i=0;i<ls;i++){if(s[i]==a[0]){flag=dfs(i,0,1);    if(flag)break;}}if(flag)printf("YES\n");else printf("NO\n");}return 0;}//测试数据     an*****ni***v*e*niver*r*sary         YES //             *a*nni**v**e**rsaryanniversary       YES //              annnnnnivennrversavery              NO 


刚看了人家写的代码,挺好理解的附上代码:

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;char a[105];char b[20]="anniversary";int len;int flag;void dfs(int p1,int p2,int cnt){if(cnt>3){return;}if(p2>=11){flag=1;return;}for(int i=p1;i<len;i++){int x=i,y=p2;while(a[x]==b[y])//相等就跳过 x++,y++;dfs(x+1,y,cnt+1);//不相等,那么就继续往后找下一个区间 } }int main(){int T;scanf("%d",&T);while(T--){flag=0;scanf("%s",a);len=strlen(a);dfs(0,0,0);if(flag)printf("YES\n");elseprintf("NO\n");}return 0;}


 
0 0
原创粉丝点击