您的位置:首页 > 其它

杂文 ZOJ问题 hdoj 3788

2014-08-13 19:49 351 查看
/*

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c printf sizeof 杭电