[NOIP2011 普及组] 统计单词数
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。
输入格式
共 $2$ 行。
第 $1$ 行为一个字符串,其中只含字母,表示给定单词;
第 $2$ 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 $0$ 开始);如果单词在文章中没有出现,则直接输出一个整数 $-1$。
注意:空格占一个字母位
样例 #1
样例输入 #1
To
to be or not to be is a question
样例输出 #1
2 0
样例 #2
样例输入 #2
to
Did the Ottoman Empire lose its power at that time
样例输出 #2
-1
提示
数据范围
$1\leq $ 第一行单词长度 $\leq10$。
$1\leq $ 文章长度 $\leq10^6$。
noip2011 普及组第 2 题
//读入空格
//统一大小写tolower() toupper()
//find()
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a;
string b;
//getline()读入字符串一整行
//gets()读入字符数组的一整行
getline(cin,a);
getline(cin,b);
//字符串a.length()
//字符数组strlen(a)
//tolower() 函数用于将给定的字符转换为小写
//tolower 函数的参数是 int 类型,因此在使用时需要确保传递的字符值适合作为 int 类型处理。
//当处理可能不是有效字符的值时(例如,负值或超出标准 ASCII 范围的值),使用 static_cast<unsigned char> 可以确保值在正确的范围内
//tolower(static_cast<unsigned char>(c))
//toupper转换成大写
for (int i=0;i<a.length();++i)
{
a[i]=tolower(a[i]);
}
for (int i=0;i<b.length();++i){
b[i]=tolower(b[i]);
}
//加空格 确保为单个单词
a=' '+a+' ';
b=' '+b+' ';
//find(first,last,要找的值)返回一个迭代器,指向在范围内找到的第一个匹配元素。如果没有找到匹配的元素,则返回 last。
//string::npos通常用于表示“未找到”的状态
if (b.find(a)==string::npos){
cout<<-1<<endl;
}
else {
int alpha=b.find(a);
int beta=b.find(a),s=0;
while (beta!=string::npos){
++s;
beta=b.find(a,beta+1);
}
cout<<s<<" "<<alpha<<endl;
}
return 0;
}