这篇文章写于初学 OI 时,转载于 https://www.luogu.com.cn/article/99llrme4

有错也懒得改了,只是想存下来。

[NOIP2011 普及组] 统计单词数

题目描述

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。

输入格式

共 $2$ 行。

第 $1$ 行为一个字符串,其中只含字母,表示给定单词;

第 $2$ 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出格式

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 $0$ 开始);如果单词在文章中没有出现,则直接输出一个整数 $-1$。

样例 #1

样例输入 #1

1
2
To
to be or not to be is a question

样例输出 #1

1
2 0

样例 #2

样例输入 #2

1
2
to
Did the Ottoman Empire lose its power at that time

样例输出 #2

1
-1

提示

数据范围

$1\leq $ 第一行单词长度 $\leq10$。

$1\leq $ 文章长度 $\leq10^6$。

noip2011 普及组第 2 题



正文开始

2023-02-08

第一次理解的题意:给定一个单词和一个句子,在句子中寻找单词出现的位置和次数,大小写无区别。

思路:每次输入,每次比较,每次记录。

于是有了以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<string>
using namespace std;
#define str string

str tu(str a){for(int i=0;i<a.size();i++) if(a[i]>='a'&&a[i]<='z') a[i]-=32;return a;}

int main(){
ios::sync_with_stdio(0);
cin.tie(0);
str nd,pre;
cin>>nd;
nd=tu(nd);

int i=0,a1=0,a2=0;
while(cin>>pre){
if(tu(pre)==nd) a1++,a2=i;
}
if(!a1) cout<<"-1"<<endl;
else cout<<a1<<" "<<a2<<endl;

return 0;
}

WA原因:没有考虑到位置的处理,位置的要求是第二行的位置,而不是单词位置。

2023-02-27

第二种思路:用getline,一个一个字符比较。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<string>
#include<iostream>
#include<cstdio>
using namespace std;
string ToUpper(string a){
for(int i=0;i<a.size();i++){
if(a[i]>='a'&&a[i]<='z') a[i]+=('A'-'a');
}
return a;
}
int main(){
string line,word;
cin>>word;
getline(cin,line);
getline(cin,line);
word=ToUpper(word),line=ToUpper(line);

int ans1=0,ans2=-1;
for(int i=0;i<line.size();i++){
bool flag=1;
for(int j=0;j<word.size()-1;j++){
if(line[i+j]!=word[i]){
flag=0;
break;
}
}
if(flag){
ans1++;
if(ans2==-1) ans2=i;
}
}

if(!ans1) cout<<"-1"<<endl;
else cout<<ans1<<char(32)<<ans2<<endl;

return 0;
}

懒得知道WA,RE的原因是啥了(数组越界?)。

早点睡了,明天用STL写。

总结原因:写题时考虑问题全面。已经不是第一次出现这种情况了,这道题只是一个特例。有的时候写题在没有思考的情况下就看题解,然后按照题解的思路写题。希望未来的自己可以养成良好的做题习惯

First Update at 2023/2/27 22:02

2023-3-31

这道题在上代码不出错的情况下后面加个 空格 就完了。

懒得改了。

Second Update at 2023/3/31 21:27