解题报嘞个告:
这个题蛋疼的难以想象……
先把我的失败经历放到这里大家共勉……
--首次尝试--
很偷懒的用string对象读入key word和article,再全转大写,逐词比较,提交之,WA。
增加记录article中每两个单词中间的空格数,提交之,WA。
过滤key word中的空格和换行符'\n',提交之,WA。
各种小改动,怒交3次,一次RE,两次WA……
--第一次重写--
竖日,痛定思痛,决定推倒重来。
用char数组存key word和article,转大写,逐词比较,提交之,WA。
遂怒,转而纠结其他题目,此事作罢。
--第二次重写--
今天,依然用char数组存储,但在key word和article前后加上空格,直接全文比较,在经过几个代码失误的RE后,提交之,WA。
过滤前空格,过滤换行符,过滤article中换行符,过滤article中其他乱七八糟的东西,怒交5次,WAWAWAWAWA。
--第三次重写--
吐血之余,求教thoar大牛,得文章一篇,阅罢,大惊。
他喵的应该过滤的是‘\r'!!!!!
模仿文中代码,再次重写,终AC……
那篇文章地址:
http://tieba.baidu.com/p/1343249706
核心思想即Windows与Linux下测试数据'\n''\r'的问题。
下面是我模仿的代码……
AC代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <cstdlib>
using namespace std;
const int WORD_LEN = 21;
const int MAX_LEN = 1000011;
int main()
{
static char key[WORD_LEN], article[MAX_LEN];
int counter = 0, location, keylen;
gets(key);
gets(article);
for(keylen = 0; isalpha(key[keylen]); keylen++);
for(int i = 0; article[i]; ++i)
{
if (!isalpha(article[i]))
{
continue;
}
else if((strncasecmp(&article[i], key, keylen)==0) && (!isalpha(article[i + keylen])))
{
if(counter == 0)
{
location = i;
}
counter++;
i += keylen;
}
else
{
while (isalpha(article[i]))
{
i++;
}
}
}
if(counter != 0)
{
cout << counter << ' ' << location << endl;
}
else
{
cout << -1 << endl;
}
return 0;
}
题目是这样的:
4030:统计单词数
- 时间限制:
- 1000ms 内存限制:
- 65535kB
- 描述
-
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同 (参见样例 1) ,如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2) 。 输入 - 第 1 行为一个字符串,其中只含字母,表示给定单词;
第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。 输出 - 只有一行, 如果在文章中找到给定单词则输出两个整数, 两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始) ;如果单词在文章中没有出现,则直接输出一个整数-1。
输出结果表示给定的单词 To 在文章中出现两次,第一次出现的位置为 0。
【输入输出样例 2 说明】
表示给定的单词 to 在文章中没有出现,输出整数-1。
【数据范围】
1 ≤单词长度≤10。
1 ≤文章长度≤1,000,000。