题解 P6882 【[COCI2016-2017#3]Imena】

· · 题解

一个有意思的字符串题目

(顺便吐槽一下毒瘤数据)

为什么说他有意思呢,他的数据点令人十分迷茫本体题解最有意思的地方在最下面 因为这个数据点没公开,他的毒瘤数据我也不知道到底是怎样的。 本体题解最有意思的地方在最下面

所有做题只得20分,以及对所有对自己的程序充满信心的看我的题解最好从下往上翻蒟蒻表示这个题目调试了一上午。。。

首先, 本题目就是一个字符串的单个处理问题 读入+判断

我用的是一边读入一边处理,单个字符读入用的是getchar();(getchar()可以读入单个字符包括空格跟换行符20分的大部分人都出问题在处理换行符,不止开头要处理,数据中间也有可能会出现

我的处理方法是:

if(a[len]=='\n') len--;

列举几个处理非常有可能出错的的情况:

字符方面

大写字母开头,数字在中间,大写字母结尾(AAA123AAA)

数字开头,大写字母在中间,数字结尾(123AAA123)

全是数字(123123)

全是大写字母(AAA)

可以先给大家看一下我的AC代码(我的代码不重要,最重要的是下面的东西

#include<cstdio>
#include<iostream>
using namespace std;
char a[10000];
int main(){
    int n,len=1,sum=0,k=0;
    scanf("%d",&n);getchar();
    a[1]=' ';
    for(int i=1;i<=n;i++){
        while(true){
            a[++len]=getchar();
            if(a[len]=='\n') len--;
        //  cout<<"|"<<a[len-1];
            if(a[len]=='.'||a[len]=='!'||a[len]=='?'){
                //for(int i=1;i<=len;i++)cout<<a[i];
                len=1;a[1]=' ';
                break;  
            }

            if(a[len-1]==' '&&a[len]>='A'&&a[len]<='Z'){
                while(true){
                    //cout<<a[len]<<";";
                    a[++len]=getchar();
                    if(a[len]==' '||a[len]=='.'||a[len]=='?'||a[len]=='!'){

                        sum++;
                        k=1;
                        break;
                    }
                    if(a[len]<='9')break;
                }
            }
            if(k==1)
                if(a[len]=='.'||a[len]=='?'||a[len]=='!'){
                    k=0;
                    len=1;a[1]=' ';break;
                }
                else k=0;
        }
        printf("%d\n",sum);sum=0;
    }
    return 0;
} 

本题解最精彩的部分就是下面我要写的这些(高能预警)

首先,我这道题目被卡的时候我去翻了翻其他过了的小伙伴的AC程序,然后、、、我竟然成功的找了一组数据把他的AC程序打掉了??!!

数据:

1

AA13A 444 Akuvliuvi liugviavdliadAA.

输出应该是1

这是那个被打掉的代码在落谷AC的界面

然后我在评论区发了个帖子求救,有位大佬贴上了他的AC代码,结果、、、又被我hack掉了,还是那组数据

这是我测的帖子里的代码的AC界面

又多了一个AC以后被打掉的。。网址

最后贴上我发评论的那个帖子:帖子

所以,不管是过了还是没过的都可以拿这组数据试一下。同时我希望落谷能改一改这道题目的数据点然后尽快开放下载。。。