首页 > ACM题库 > HDU-杭电 > HDU 3788-ZOJ问题[解题报告]HOJ
2015
04-13

HDU 3788-ZOJ问题[解题报告]HOJ

ZOJ问题

问题描述 :

对给定的字符串(只包含’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;

输出:

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

样例输入:

zoj
ozojo
ozoojoo
oozoojoooo
zooj
ozojo
oooozojo
zojoooo

样例输出:

Accepted
Accepted
Accepted
Accepted
Accepted
Accepted
Wrong Answer
Wrong Answer

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3788

 

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char s[1001];
int len,cnt,flag1,flag2,flag3,i;
while(gets(s)!=NULL){
len=strlen(s);
cnt=0;
flag1=flag2=-1;
flag3=0;
for(i=0;i<len;i++){
if(s[i]!='z'&&s[i]!='o'&&s[i]!='j'){
flag3=1; //记录是否有非法字符;
break;
}
}
for(i=0;i<len;i++){
if(s[i]=='z'){
flag1=i;//z第一次出现;
break;
}
}
for(i=len-1;i>=0;i--){
if(s[i]=='j'){
flag2=i;//j最后一次出现;
break;
}
}
if(flag1>flag2||flag1==-1||flag2==-1||flag3==1){
printf("Wrong Answer/n");
}
else{
for(i=flag1+1;i<flag2;i++){
if(s[i]=='o'){
cnt++;
}//统计z、j中间o的个数
}
//printf("cnt=%d/n",cnt);
if(cnt!=flag2-flag1-1||cnt==0){//判断z、j中间是否出现除o以外的字符;cnt=0是zoj中间没有出现o,不合法;
printf("Wrong Answer/n");
}
else{
if(flag1*cnt==len-flag2-1){
printf("Accepted/n");
}
else{
printf("Wrong Answer/n");
}
}
}
}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

参考:http://blog.csdn.net/xiajun07061225/article/details/6230129


  1. int half(int *array,int len,int key)
    {
    int l=0,r=len;
    while(l<r)
    {
    int m=(l+r)>>1;
    if(key>array )l=m+1;
    else if(key<array )r=m;
    else return m;
    }
    return -1;
    }
    这种就能避免一些Bug
    l,m,r
    左边是l,m;右边就是m+1,r;

  2. 第二个方法挺不错。NewHead代表新的头节点,通过递归找到最后一个节点之后,就把这个节点赋给NewHead,然后一直返回返回,中途这个值是没有变化的,一边返回一边把相应的指针方向颠倒,最后结束时返回新的头节点到主函数。

  3. #include <cstdio>
    #include <cstring>

    const int MAXSIZE=256;
    //char store[MAXSIZE];
    char str1[MAXSIZE];
    /*
    void init(char *store) {
    int i;
    store['A']=’V', store['B']=’W',store['C']=’X',store['D']=’Y',store['E']=’Z';
    for(i=’F';i<=’Z';++i) store =i-5;
    }
    */
    int main() {
    //freopen("input.txt","r",stdin);
    //init(store);
    char *p;
    while(fgets(str1,MAXSIZE,stdin) && strcmp(str1,"STARTn")==0) {
    if(p=fgets(str1,MAXSIZE,stdin)) {
    for(;*p;++p) {
    //*p=store[*p]
    if(*p<’A’ || *p>’Z') continue;
    if(*p>’E') *p=*p-5;
    else *p=*p+21;
    }
    printf("%s",str1);
    }
    fgets(str1,MAXSIZE,stdin);
    }
    return 0;
    }