题解 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以后被打掉的。。网址
最后贴上我发评论的那个帖子:帖子
所以,不管是过了还是没过的都可以拿这组数据试一下。同时我希望落谷能改一改这道题目的数据点然后尽快开放下载。。。