HDOJ 5311 Hidden String(DFS不错的题)

Hidden String

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


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
   
   
   
   
2 annivddfdersewwefary nniversarya
 

Sample Output
   
   
   
   
YES NO 刚开始暴力枚举了切割点,但是越写越懵,就停了,然后用DFS来写 ac代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define MAXN 110
char s1[MAXN];
char s2[13]={"anniversary"};
int bz,len;
void dfs(int b1,int b2,int num)
{
	int i;
	if(b2>=11&&num<=3)
	{
		bz=1;
		return;
	}
	if(num>3)//切割点数量
	return;
	if(b1>=len||bz)
	return;
	for(i=b1;i<len;i++)
	{
		int x=i;
		int y=b2;
		while(s1[x]==s2[y]&&y<11&&x<len)
		{
			x++;
			y++;
		}
		dfs(x,y,num+1);
    }
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		bz=0;
		scanf("%s",s1);
		len=strlen(s1);
		dfs(0,0,0);
		if(bz)
		printf("YES\n");
		else
		printf("NO\n");
	}
	return 0;
}


你可能感兴趣的:(HDOJ 5311 Hidden String(DFS不错的题))