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


  • 相关阅读:
    《大话设计模式》的一些总结
    一个仿jdkd的动态代理
    一道笔试题(构造数组)
    c# 汉字转拼音
    IDEA常用插件盘点(香~~)
    服务器概念、应用服务器盘点大科普
    创建一个简单的Struts 2程序
    JAVA(Object类、Date类、Dateformat类、Calendar类)
    DQL查询语句和约束
    MySQL操作语句
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6802562.html
Copyright © 2020-2023  润新知