hdu--5311

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


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值