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。
NOIP2011 普及组 stat
Source
———————————————————————————————————————————
这道题最大的坑(个人认为)就是Ottoman里面也含有to。所以利用find查找时,不能单纯查找“to”,得在to前后增加一个空格,即查找“ to "。当然考虑to可能在句首的情况,被查找的句子首尾也得加上一个空格。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
while(cin>>s)
{
getchar();
for(int i=0;i<s.length();i++)//统一大小写
s[i]=tolower(s[i]);
string str;
getline(cin,str);
for(int i=0;i<str.length();i++)//统一大小写
str[i]=tolower(str[i]);
s=' '+s+' ';//考虑到单词是独立的所以增加前后两个空格
str=' '+str+' '; //例如Ottoman里也有to 如果不这样处理会错误
int ans=str.find(s);
int flag=0,cnt=0;
int po=-1;
while(ans!=string::npos)
{
if(ans>=0)//0也是一个位置
{
if(flag==0)
{
po=ans;
flag=1;
}
cnt++;
}
ans=str.find(s,ans+1);
}
if(cnt)
cout<<cnt<<" "<<po<<endl;
else
cout<<po<<endl;
}
}