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. 1≤l1≤r1<l2≤r2<l3≤r3≤n
2. The concatenation of s[l1..r1] , s[l2..r2] , s[l3..r3] is "anniversary".
1. 1≤l1≤r1<l2≤r2<l3≤r3≤n
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
(1≤T≤100)
, 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.
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
2 annivddfdersewwefary nniversarya
Sample Output
YES NO解题思路:这道题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"); else printf("NO\n"); } return 0; }