2445: 【普及-】【P1308】统计单词数

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:54 解决:17

题目描述

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

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

数据范围

1 第一行单词长度 10

1 文章长度 106

noip2011 普及组第 2 题


输入

共 lns="http://www.w3.org/1998/Math/MathML">2 行。

第 lns="http://www.w3.org/1998/Math/MathML">1 行为一个字符串,其中只含字母,表示给定单词;

第 lns="http://www.w3.org/1998/Math/MathML">2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 lns="http://www.w3.org/1998/Math/MathML">0 开始);如果单词在文章中没有出现,则直接输出一个整数 lns="http://www.w3.org/1998/Math/MathML">1

样例输入 复制

To
to be or not to be is a question

样例输出 复制

2 0

提示

#include<bits/stdc++.h>
using namespace std;

int main(){
	string s1,s2;
	int idx=0,cnt=0;
    getline(cin,s1);
    getline(cin,s2);
    for (int i=0;i<s1.length();i++)
    	if (s1[i]>='A'&&s1[i]<='Z')
    	    s1[i]+=32; //不区分大小写,则可把所有大写字符转为小写字符
    for (int i=0;i<s2.length();i++)
    	if (s2[i]>='A'&&s2[i]<='Z')
    	    s2[i]+=32;	
    s1=" "+s1+" "; //如果要查找单词"to",则应该查找" to ",以避免"tomorrow"此类也误判为"to"
    s2=" "+s2+" "; //文章也需要在最前和最后加" ",以避免少找第1个或最后1个为需要找的单词的情况
    while((int)(idx=s2.find(s1,idx))!=-1) { //查找所有单词,记录个数
    	idx++; 
    	cnt++;
	}
	if (cnt>0) cout<<cnt<<" "<<s2.find(s1,0)<<endl;	    
    else cout<<-1<<endl;        
	return 0;
}