Description
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即单词必须与文章中某一独立残次在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
Input
输入文件共2行。
第1行为一个字符串,其中只包含字母,表示给定单词;
第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
Output
只有1行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数-1。
Sample Input
To
to be or not to be is a question
to
Did the Ottoman Empire lose its power at that time
Sample Output
2 0
-1
HINT
1<=单词长度<=10。
1<=文章长度<=10,000,000。
解析:我们可以利用左右空格来确定单个单词,然后利用find()来搜索判断,注意一点,我们找到了对应单词,我们可以利用erase函数把此前的文段直接删除,避免无效搜索,不然会时间超限啦。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int cnt,i,wz,pos; //wz记录第一次出现位置
string a,b; //a是单词,b是文章
while(cin>>a){
cnt=0; //记录单词出现次数
getchar();
getline(cin,b);
for(i=0;i<a.length();i++){ //单词和文章都转化为小写
if(a[i]>='A'&&a[i]<='Z') a[i]=a[i]+32;
}
for(i=0;i<b.length();i++){
if(b[i]>='A'&&b[i]<='Z') b[i]=b[i]+32;
}
a=" "+a+" "; //利用来空格来判断完整单词!!
b=" "+b+" ";
if(b.find(a)!=string::npos){ //寻找第一次出现位置
wz=b.find(a); //记录首次位置
while(b.find(a)!=string::npos){
cnt++; //记录总共出现次数
pos=b.find(a); //定位
b.erase(0,pos+a.length()-1); //删除前面的文段,避免无效搜索
} //减一是为了把空格留下来,保留对应格式
printf("%d %d\n",cnt,wz);
}else{
printf("-1\n");
}
}
return 0;
}