1399 - ZOJ问题

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

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

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

题目输入

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

题目输出

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

输入/输出样例

输入格式

zoj
ozojo
ozoojoo
oozoojoooo
zooj
ozojo
oooozojo
zojoooo

输出格式

Accepted
Accepted
Accepted
Accepted
Accepted
Accepted
Wrong Answer
Wrong Answer

C语言解答

#include <stdio.h>
#include <string.h>
#define SIZE 1000

int main()
{
  char line[SIZE];
  while(1)
  {
    if(scanf("%s",line)==EOF)
    {
      break;
    }
    int len =strlen(line);
    int inz=strchr(line,'z')-line;
    int inj=strchr(line,'j')-line;
    if(inj<0||inz<0)
    {
      printf("Wrong Answer\n");
      continue;
    }
    int count=inj-inz-1;
    int flag=0;
    if(count>=1)
    {
      
      for(int i=inj+1;i<len;i++)
      {
        if(line[i]!='o')
        {
          flag=1;
          break;
        }
      }
      for(int i=inz+1;i<inj;i++)
      {
        if(line[i]!='o')
        {
          flag=1;
          break;
        }
      }
      if(flag==1)
      {
        printf("Wrong Answer\n");
        continue;
      }
      int result=len-inj-1;
      for(int i=count;i>=1;i--)
      {
        result=result-inz;
        if(result<=0)
        {
          break;
        }
      }
      if(result!=0)
      {
        printf("Wrong Answer\n");
      }
      else if(result==0)
      {
        printf("Accepted\n");
      }
    }
    else if(count<1)
    {
      printf("Wrong Answer\n");
    }
  }
}

C++解答

#include <stdio.h>

bool Judge(char *str){		// 判断字符串是否符合要求
	int oBeforeZ=0, oMid=0, oAfterJ=0;	// 分别存储 z 前面、z 与 j 之间以及 j 之后的o的数目。
	int i = 0;
	while(str[i] && str[i]=='o'){		// 计算 z 之前的 o 的数目,这里注意不能超出字符串边界(用 str[i]来判断,下同)
		i++;
		oBeforeZ++;
	}
	if(str[i] != 'z'){		// 如果第一次遍历 o 结束后的字符不是 z 则不符合要求
		return false;
	}

	i++;
	while(str[i] && str[i]=='o'){		// 计算 z 与 j 之间 o 的数目
		i++;
		oMid++;
	}
	if(!oMid || str[i]!='j'){			// 如果中间没有 o 或者中间 o 之后的字符不是 j,则不符合
		return false;
	}

	i++;
	while(str[i] && str[i]=='o'){		// 计算 j 之后 o 的数目
		i++;
		oAfterJ++;
	}

	if(str[i]){							// 如果 j 之后的 o 都统计完了还没有到达字符串结尾,则不符合
		return false;
	}

	return oBeforeZ*oMid == oAfterJ;	// 只有 z 前面 o 的数目与中间 o 数目的乘积与 j 后面 o 的数目相同,才符合
}

int main(){
	char str[1100];		// 用来读入字符串
	while(scanf("%s", str) != EOF){
		puts(Judge(str) ? "Accepted" : "Wrong Answer");
	}

	return 0;
}

Java解答

import java.util.*;

public class Main{
    public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    while(in.hasNext()){
        String str = in.next();
        int n = str.length();
        int z = str.indexOf("z");
        int j = str.indexOf("j");
        int countz = 0, countj = 0;
        for(int i=0;i<str.length();i++)
            if(str.charAt(i)=='z')
                countz++;
            else if(str.charAt(i)=='j')
                countj++;
        if(countz!=1||countj!=1)
            System.out.println("Wrong Answer");
        else if(z>j)
            System.out.println("Wrong Answer");
        else if(str.charAt(0)=='z'&&str.charAt(1)=='j'){
            System.out.println("Wrong Answer");
        }
        else{
        String[] strarray = str.split("z|j");
        int a = strarray[0].length(), b = strarray[1].length(), c = 0;
        if(str.charAt(n-1)=='o')
            c = strarray[2].length();
        if(b==0)
            System.out.println("Wrong Answer");
        else if(c/b==a)
            System.out.println("Accepted");
        else
            System.out.println("Wrong Answer");
        }
    }
}
}