OJ_1006 ZOJ问题

#include <iostream>
#include <string>
using namespace std;
int a[128]={0};
void func()
{
     string s;
     while(cin>>s)
     {
                  int o1,o2,o3;
                  o1=o2=o3=0;
                  a['z']=0;
                  a['o']=0;
                  a['j']=0;
                 for(int i=0;i<s.size();i++)
                 {
                         char c=s[i];
                         a[c]++;
                         if(c=='z'&&a['z']==1)// 第一次z 
                         {
                                   o1=a['o'];
                         }else
                         if(c=='j'&&a['j']==1)
                         {
                                   o2=a['o']-o1;
                         }
                         
                 } 
                 o3=a['o']-o1-o2;
                 bool flag=false;
                    // z j ==1
                 int countz=a['z'];
                 int countj=a['j'];
                 if(countz==1&&countj==1&&o2>=1&&o1*o2==o3)
                                                           flag=true;
                 
                /* else{
                     // rule 1 rule 2
                     if(o1==o3&&o2==1)
                                      flag=true;
                     
                     // rule 3
                     // azbojac to azbjc
                     // o1=a o2=b+1 o3=o1+x
                     // o3>=o1 o2>=1
                  
                     // rule 3
                     else if(o3==o1&&o2>=1)flag=true;
                     else if(o3>o1&&o2>=2)flag=true;
                     
                 }
              */
                
                 if(flag)cout<<"Accepted"<<endl;
                 else
                     cout<<"Wrong Answer"<<endl;
     }
}
void func1()
{
     char str[1001];
     while(cin>>str)
     {
                    char *p=str;
                    int a,b,c;
                    a=b=c=0;
                    int o,z,j;
                    o=z=j=0;
                    
                    while(*p!='\0')
                    {
                         if(*p=='o')  o++;
                         else if(*p=='z'){
                                          z++;
                                          a=o;  
                              }else if(*p=='j'){// z first
                                                j++;
                                                b=o-a;
                                    }
                              p++;        
                    }
                    c=o-a-b;
                    
                    if(z==1&&j==1&&b>0&&a*b==c)
                                    cout<<"Accepted"<<endl;
                    else 
                         cout<<"Wrong Answer"<<endl;
                             
                    
                  
     }
}

void func2()
{
     char s[1001];
     while(cin>>s)
     {
                  bool flag=false;
                    int a,b,c;
                    a=b=c=0;
                    int o,z,j;
                    o=z=j=0;
                    int i=0;               
                    while(s[i]=='o' && s[i]!='\0') {a++; i++;}
                    if(s[i]=='z')
                    {
                                 ++i;
                                  while(s[i]=='o' &&s[i]!='\0') {b++; i++;}
                                  if(s[i]=='j')
                                   {
                                     ++i;
                                      while(s[i]=='o' && s[i]!='\0') {c++; i++;}
                                      if(s[i]=='\0'){
                                                     if(b>=1&&a*b==c)
                                                                     flag=true;
                                       }
                                   }
                                   
                                  
                    }  
                    if(flag)cout<<"Accepted"<<endl;
                    else
                     cout<<"Wrong Answer"<<endl;
                    
                  
     }
}

int main(int argc, char *argv[])
{
    
	//printf("Hello, world\n");
	func2();
	return 0;
}

func和func1都WA,估计某些用例通过不了……比如输入了zoj之外的字母,zj个数不只一次等等

func2按zoj出现次序一步步来,关键在于z左边o的个数a,zj之间o的个数b,j右边o的个数c存在关系a*b==c时即符合第三个规则

证明:因为第二条规则,azbjc的最初始情况就是azoja,

则azbojac=azoojaa

下一递推是azooojaaa

由数学归纳法得出a*b==c


题目描述:
对给定的字符串(只包含'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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值