【HDU 1797】【水题】Match the string

  其实题很水的,一开始想用sscanf做,做了半天。。懵逼了。限时训练还是老老实实来做吧。。。用不优雅的解法做的。。sscanf还需要继续了解,上次IP地址那题也是不清不楚的过的。半期考后吧。。。


#include "stdio.h"
#include "string.h"
char s[100005];
int f1(int n)
{
	for (int i = 0; i < n; ++i)
	{
		if(s[i]!='a')
			return 0;
	}
	return 1;
}
int f2(int n,int m)
{
//	printf("aa\n");
	if(s[n]=='d')
	{
	//	printf("a\n");
		for (int i = n+1; i < m; ++i)
		{
			if(s[i]!='d')
				return 0;
		}
		return 1;
	}
	else if(s[n]=='b')
	{
	//	printf("b\n");
		if(s[n+1]=='d')
	    {
	    	for (int i = n+1; i < m; ++i)
	    	{
	    		if(s[i]!='d')
	    			return 0;
	    	}
	    	return 1;
	    }
	    else if(s[n+1]!='h')
	    	return 1;
	    else
	    	return 0;
	}
	return 0;
}
int f3(int n,int m)
{
	for (int i = n; i < m; ++i)
	{
		if(s[i]!='f' && s[i]!='k')
			return 0;
	}
	return 1;
}
int main(int argc, char const *argv[])
{
	int num;
	char a1[]="ba";
	scanf("%d",&num);
	getchar();
	while(num--)
	{
		memset(s,0,sizeof(s));
		scanf("%s",s);
		getchar();
		char *p1=strstr(s,a1);
		char *p2=strchr(s,'h');
		if(p2==NULL || p1==NULL)
		{
		    printf("NO\n");
            continue;	
		}
		int flag1=p1-s;
		int flag2=p2-s;
        if(flag2 && flag1)
        {
        	//printf("1\n");
        	if(f1(flag1)==0)
        	{
        		printf("NO\n");
        		continue;
        	}
        	//printf("2\n");
            if(f2(flag1+2,flag2)==0 && flag2!=flag1+2)
            {
            	printf("NO\n");
        		continue;
            }
           // printf("3\n");
            if(f3(flag2+1,strlen(s))==0)
            {
            	printf("NO\n");
        		continue;
            }
            printf("YES\n");

        }
        else
        	printf("NO\n");

	}
	return 0;
}


你可能感兴趣的:(c,水题)