HDOJ 3788 ZOJ问题

ZOJ问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3286    Accepted Submission(s): 982


Problem Description
对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC。

是否AC的规则如下:
1. zoj能AC;
2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者为空;
3. 若azbjc 能AC,则azbojac也能AC,其中a,b,c为N个'o'或者为空;
 

Input
输入包含多组测试用例,每行有一个只包含'z','o','j'三种字符的字符串,字符串长度小于等于1000;
 

Output
对于给定的字符串,如果能AC则请输出字符串“Accepted”,否则请输出“Wrong Answer”。
 

Sample Input
   
   
   
   
zoj ozojo ozoojoo oozoojoooo zooj ozojo oooozojo zojoooo
 

Sample Output
   
   
   
   
Accepted Accepted Accepted Accepted Accepted Accepted Wrong Answer Wrong Answer
 


继续赛后清题,这题以前做过,还是跪了!!!

 

题解: 可根据前面两条规则,推断出一个规律:
                                         1.形成zoooj,两端有o或者没有o的情况; 
                                          2.形成oozoojoooo,z前面o的个数于z,j之间o的个数的积等于j后面o的个数。 

 

具体代码如下:

 

#include<cstdio>
#include<cstring>
char str[1010];
int main()
{
	int len,z,j,a,b,c,x,y,i;
	while(scanf("%s",str)!=EOF)
	{
		a=b=c=0;
		len=strlen(str);
		for(i=0;i<len;i++)
		{
			if(str[i]=='z')
			{
				a++;
				z=i;//标记z出现的位置 
			}
			else if(str[i]=='j')
			{
				b++;
				j=i;//标记j出现的位置 
			}
			else
				c++;
		}
		if(a==1&&b==1&&c!=0)//每个字符串里只有一个z和j
		{
		    x=z;//统计z前面的o的个数 
		    y=len-1-j;//统计j后面的o的个数 
		    if(x==0&&y==0&&c!=0)
		       printf("Accepted\n");
		    else if(c-x-y!=0&&(x*(c-x-y)==y))
		       printf("Accepted\n");
		    else
		    	printf("Wrong Answer\n");
		}
		else
		    printf("Wrong Answer\n");
	}
	return 0;
}


 


你可能感兴趣的:(HDOJ 3788 ZOJ问题)