背景
noip2011 NO.2
描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1), 如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
格式
输入格式
输入文件共2 行。
第1 行为一个字符串,其中只含字母,表示给定单词;
第2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0 开始);如果单词在文章中没有出现,则直接输出一个整数-1。
样例1
样例输入1
To
to be or not to be is a question
Copy
样例输出1
2 0
Copy
样例2
样例输入2
to
Did the Ottoman Empire lose its power at that time
Copy
样例输出2
-1
Copy
限制
1s
提示
【数据范围】
1 ≤ 单词长度≤ 10。
1 ≤ 文章长度≤ 1,000,000 。
【输入输出样例1 说明】
输出结果表示给定的单词To在文章中出现两次,第一次出现的位置为0。
【输入输出样例2 说明】
表示给定的单词to 在文章中没有出现,输出整数-1。
来源
noip 2011
用string类做
利用cstring中的find函数即可快速ac
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <cstdlib>
using namespace std;
int n,k,m,ans,ans1=1,pos;
string s,ss;
int main()
{
getline(cin,s);
s="#"+s;
s+='#';
//cout<<s;
//cout<<s.size();
for(int i=0;i<s.size();i++)
{
s[i]=toupper(s[i]);//全部变成大写
}
getline(cin,ss);
ss="#"+ss;//边界
ss+='#';
//cout<<s<<endl<<ss<<endl;
int t=ss.size();
for(int i=0;i<t;i++)
{
ss[i]=toupper(ss[i]);
if(ss[i]==' ')ss[i]='#';//空格传换成'#' 这里必须写 很巧妙
//样例中 to变成#to# 而otto变成#otto# 这样就不匹配了
}
pos=ans=ss.find(s); //先找到第一个
while(pos!=-1)
{
pos=ss.find(s,pos+1);
if(pos!=-1) ans1++;
}
if(ans!=-1)cout<<ans1<<" ";//输出
cout<<ans;
return 0;
}