hdu 5311 Hidden String 字符串

BC一周年的题。这道题做比赛的时候A了小数据,终于评判的时候还是挂了,看来还是不认真思考的问题啊。交的时候

都没有信心过肯定是不行的。认真思考。敲一发,有信心过才是真正的acmer。赛后认真想了想,发现了好多bug,我

用的3层循环暴力做的。认真思考后敲的,认真思考后敲的。认真思考后敲的(重要的事说三遍)

贴代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char a[105];
char b[20]="anniversary";

int main()
{	
	int t,p,i,j,x,k,flag,kk,kkk;
	scanf("%d",&t);
	while(t--)
	{
		flag = 0;
		memset(a,sizeof(a),'');
		scanf("%s",a);	
		int len = strlen(a);
		for(i=0; i<len; i++)
		{
			k =0;
			if(a[i] == b[k])
			{
				p = i+1;
				k = 1;
				while(a[p]==b[k]&&a[p]!=''&&b[k]!='')
				{
					p++;
					k++;
				}
				if(k==11)
				{
					printf("YES
");
					flag = 1;
				}
				if(flag == 1)
				{
					break;
				}
				for(j=p+1; j<len; j++)
				{
					kk = k;	
					if(a[j] == b[kk])
					{
						p = j+1;
						kk++;
						while(a[p]==b[kk]&&a[p]!=''&&b[kk]!='')
						{
							p++;
							kk++;
						}
						if(kk==11)
						{
							printf("YES
");
							flag = 1;
							break;
						}
						for(x=p+1; x<len; x++)
						{
							kkk = kk;
							if(a[x] == b[kkk])
							{
								p = x+1;
								kkk++;
								while(a[p]==b[kkk]&&a[p]!=''&&b[kkk]!='')
								{
									p++;
									kkk++;
								}
								if(kkk == 11)
								{
									printf("YES
");
									flag = 1;
									break;
								}
							}
						}
						if(flag == 1 )
							break;
					}
				}
				if(flag == 1)
					break;
		    }
		    if(flag==1)
		    	break;
		}
		if(flag == 0)
		{
			printf("NO
");
		}
	} 
	return 0;
} 
看了邓大师的代码后敲的,差点儿一样。

。。用的是dfs深搜,只是我感觉还没有三层循环更有效率,这个有可能出现搜了好多层的情况,能够加一个推断。就是cnt>=3的时候直接return 0,这样的方法假设递归理解的好的话敲的比較快。并且不easy出错的。。

上代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char a[105];
char b[20]="anniversary";
int lena,lenb = 11;
int dfs(int a1,int b1,int cnt)
{
	if(cnt >= 3)
		return 0; 
	int b2 = b1;
	int j;
	for(int i=a1; i<lena && b1<11; i++)
	{
		b1 = b2;
		if(a[i] == b[b1])
		{
			for(j=i+1,b1++; j<lena && b1<11; j++,b1++)
			{
				if(a[j] != b[b1])
				{
					break;
				}
			}
			if(b1==11 && cnt<=2)	return 1;
			if(dfs(j,b1,cnt+1))		return 1;
		}
	}
	return 0;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		memset(a,'',sizeof(a));
		scanf("%s",a);
		lena = strlen(a);
		if(dfs(0,0,0))
			puts("YES");
		else
			puts("NO");
	}
	return 0;
}


原文地址:https://www.cnblogs.com/yjbjingcha/p/6802562.html