1. 程式人生 > >[洛谷] P1308 統計單詞數

[洛谷] P1308 統計單詞數

題目描述

一般的文字編輯器都有查詢單詞的功能,該功能可以快速定位特定單詞在文章中的位置,有的還能統計出特定單詞在文章中出現的次數。

現在,請你程式設計實現這一功能,具體要求是:給定一個單詞,請你輸出它在給定的文章中出現的次數和第一次出現的位置。注意:匹配單詞時,不區分大小寫,但要求完全匹配,即給定單詞必須與文章

中的某一獨立單詞在不區分大小寫的情況下完全相同(參見樣例1 ),如果給定單詞僅是文章中某一單詞的一部分則不算匹配(參見樣例2 )。

輸入輸出格式

輸入格式:

輸入檔名為stat.in ,2 行。

第1 行為一個字串,其中只含字母,表示給定單詞;

第2 行為一個字串,其中只可能包含字母和空格,表示給定的文章。

輸出格式:

輸出檔名為stat.out 。

只有一行,如果在文章中找到給定單詞則輸出兩個整數,兩個整數之間用一個空格隔開,分別是單詞在文章中出現的次數和第一次出現的位置(即在文章中第一次出現時,單詞首字母在文章中的位置,位置從 0 開始);如果單詞在文章中沒有出現,則直接輸出一個整數-1。

輸入輸出樣例

輸入樣例#1: 複製

To 
to be or not to be is a question 

輸出樣例#1: 複製

2 0

輸入樣例#2: 複製

to 
Did the Ottoman Empire lose its power at that time

輸出樣例#2: 複製

-1

說明

資料範圍

1≤ 單詞長度≤10。

1≤ 文章長度≤1,000,000。

noip2011普及組第2題

基礎的stl map容器操作

建立兩個容器

一個記錄是否出現與第一次出現位置

另一個記錄次數

#include <iostream>
#include <map>
#include <cstdio>
using namespace std;
int main()
{
	map <string,int> words;
	map <string,int> times;
	int flag = 0;
	string text,mode,tmp = "";
	cin>>mode;
	getchar();
	getline(cin,text);
	
	for(int i=0;i<mode.length();i++)
		if(mode[i] >= 'A' && mode[i] <= 'Z')
			mode[i] = mode[i]+32;
			
	for(int i=0;i<text.length();i++)
		if(text[i] >= 'A' && text[i] <= 'Z')  //統一小寫化
			text[i] = text[i] + 32;

	//cout<<mode<<endl<<text<<endl;
	for(int i = 0;i <= text.length();i ++)
	{
		if(text[i] != ' '&& text[i] != '\0')
		{
			tmp += text[i];
		}
		else if(text[i] == ' ' || text[i] == '\0')
		{
			//cout<<tmp<<flag<<endl;
			if(! words.count(tmp))
			{
				words[tmp] = flag;
				times[tmp] ++;
				tmp = "";
				flag = i + 1;
			}
			else
			{
				times[tmp] ++;
				tmp = "";
				flag = i + 1;
			}
		}
	}
	if(! words.count(mode))
		cout<<"-1"<<endl;
	else 
	{
		cout<<times[mode]<<' ';
		cout<<words[mode]<<endl;
	}
		
	return 0;
}