九度 题目1006:ZOJ问题

题目1006:ZOJ问题

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:9412

解决:1483

题目描述:
对给定的字符串(只包含'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
来源:
2010年浙江大学计算机及软件工程研究生机试真题
 

虽然第一眼看去像是DP题 但是有规律可循的 首先z j各一个 其次被z和j分成3段的o的个数满足(i,j,i*j) i>=0 j>=1的关系

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
 char str[1010];
 int a,b,c,z,i,j,iz,ij;
 int flag1,flag2;
 while(cin>>str)
 {
  flag1 = flag2 = 0;
  a=b=c=z=j=iz=ij=0;
  for(i=0;i<strlen(str);i++)
  {
   if(str[i]=='z')
   {
    z++;
    iz = i;
   }else if(str[i]=='j')
   {
    j++;
    ij = i;
   }

  }//for
  if(z!=1||j!=1||(z==1&&j==1&&iz>ij))
   cout<<"Wrong Answer"<<endl;
  else{


   for(i=0;i<strlen(str);i++)
   {
    if(flag1==0&&str[i]=='o')
     a++;
    else if(flag1==0&&str[i]=='z')
     flag1 = 1;
    else if(flag2==0&&str[i]=='o')
     b++;
    else if(flag2==0&&str[i]=='j')
     flag2=1;
    else
     c++;
   }//for

   if(a*b==c&&b!=0)
    cout<<"Accepted"<<endl;
   else
    cout<<"Wrong Answer"<<endl;
  }//else
 }//while
 
 return 0;
}

原文地址:https://www.cnblogs.com/hpuwangjunling/p/2994764.html