杂文 ZOJ问题 hdoj 3788

来源:互联网 发布:淘宝crm软件有哪些 编辑:程序博客网 时间:2024/05/29 18:47


/*
ZOJ问题
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2669    Accepted Submission(s): 812


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
 

Source
浙大计算机研究生复试上机考试-2010年

*/
/*20140813 19:40*/
/*在没有找到规律之前,测试数据都对,但是就是一直WA,不知道为什么大哭哭哭*/
/*
#include<cstdio>
#include<string.h>
#include<stdlib.h>
#define M 1000
char s[M];

int jude1(char a[])
{
 if(strcmp(a,"zoj")==0)
   return 1;
   else
    return 2;
}
int jude2(char a[])
{
 char b[M];
 int la=0,count1=0,count2=0,count3=0;
    int i=0,j=0,k=0;
    
 la=strlen(a)-1;
 while(a[i++]=='o')
  count1++;
   
  while(a[la--]=='o')
    count2++;
    
 memset(b,0,sizeof(b));
   for(j=i-1,k=0;j<=la+1;j++)
   {
    b[k++]=a[j];
   }
   b[k+1]='\0';
  
 if(strlen(b)<=3)
    {
     
   if(jude1(b)&&(count1==count2))
     return 1;
     else
      return 0;
    }
 else
 {
   for(i=0,count3=0;i<strlen(b);i++)
      {
      if(b[i]=='o')
       count3++;
      }
     if(2*count1==count2&&(count3>=count1))
       return 1;
       else
        return 0;
  }
   
}
int jude3(char a[])
{
 int i=0,j=0,l,k;
 l=strlen(a)-1;
 while(a[i++]=='o')
   ;
   while(a[l--]=='o')
    ;
   
    int p1=0,p2=0;
    for(j=i-1;j<=l+1;j++)
    {
      if(a[j]=='z')
        p1++;
        if(a[j]=='j')
          p2++;
    }
    if(a[i-1]=='z'&&a[l+1]=='j'&&p1==1&&p2==1)
      return 1;
      else
       return 0;
}

int main()
{
  memset(s,0,sizeof(s));
  while(~scanf("%s",s))
  {
   int n1,n2,n3,len=0;
   n1=jude1(s);
   n2=jude2(s);
   n3=jude3(s);
    len=strlen(s);
   if(len<=3)
     {
      if(n1&&n3)
       printf("Accepted\n");
       else
        printf("Wrong Answer\n");
     }
     else
     {
      if(n2&&n3)
        printf("Accepted\n");
       else
        printf("Wrong Answer\n");
     }
   
  }
  return 0;
}
*/
/*
条件二和条件三要结合起来理解,最后会发现如下规律:
设:
a = 第一个z前o的个数
b = 夹在z和j之间的o的个数
c = 第一个j之后的o的个数
则有条件二三有:a,b,c满足a*b=c

而条件二的xzojx也刚好满足上述条件
另外要注意几点,那就是
1、b>0,例如输入 zj,输出应该为WA而不是AC
2、必须是z在j的前面;
3、z和j只能出现一次;

*/

/*AC*/

#include<cstdio>
#include<string.h>
#include<stdlib.h>
#define M 1010
char s[M];
int main()
{
 memset(s,0,sizeof(s));
 while(~scanf("%s",s))
 {
  int i,j,k,l;
  int a=0,b=0,c=0;
    l=strlen(s)-1;
   
    i=0,a=0;
    while(s[i++]=='o')//计算z之前的o的个数
     a++;
  
     c=0;
    while(s[l--]=='o')//计算j之后的o的个数
     c++;

        int p1=0,p2=0;
    for(j=i-1,b=0;j<=l+1;j++)//这一步不可少,判断z和j 的个数,需要注意边界;
    {
     if(s[j]=='z')
       p1++;
      if(s[j]=='o')
        b++;
        if(s[j]=='j')
         p2++;
     
    }
  if(s[i-1]=='z'&&s[l+1]=='j') //必须满足z在前,j在后,此步骤是题目的一大坑;还需注意边界
  {
   
  
    if(b>0&&b*a==c&&(p1==1)&&(p2==1))//z和j的个数必须都满足有且仅有一个;
    printf("Accepted\n");
    else
     printf("Wrong Answer\n");
  }
  else
     printf("Wrong Answer\n");
 }
 return 0;
}

0 0