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".
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.
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;
}