統計單詞(p1308)
P1308 [NOIP 2011 普及組] 統計單詞數
題目描述
一般的文本編輯器都有查找單詞的功能,該功能可以快速定位特定單詞在文章中的位置,有的還能統計出特定單詞在文章中出現的次數。
現在,請你編程實現這一功能,具體要求是:給定一個單詞,請你輸出它在給定的文章中出現的次數和第一次出現的位置。注意:匹配單詞時,不區分大小寫,但要求完全匹配,即給定單詞必須與文章中的某一獨立單詞在不區分大小寫的情況下完全相同(參見樣例 1),如果給定單詞僅是文章中某一單詞的一部分則不算匹配(參見樣例 2)。
輸入格式
共 \(2\) 行。
第 \(1\) 行為一個字符串,其中只含字母,表示給定單詞;
第 \(2\) 行為一個字符串,其中只可能包含字母和空格,表示給定的文章。
輸出格式
一行,如果在文章中找到給定單詞則輸出兩個整數,兩個整數之間用一個空格隔開,分別是單詞在文章中出現的次數和第一次出現的位置(即在文章中第一次出現時,單詞首字母在文章中的位置,位置從 \(0\) 開始);如果單詞在文章中沒有出現,則直接輸出一個整數 \(-1\)。
注意:空格占一個字母位
輸入輸出樣例 #1
輸入 #1
To
to be or not to be is a question
輸出 #1
2 0
輸入輸出樣例 #2
輸入 #2
to
Did the Ottoman Empire lose its power at that time
輸出 #2
-1
說明/提示
數據范圍
$1\leq $ 第一行單詞長度 \(\leq10\)。
$1\leq $ 文章長度 \(\leq10^6\)。
noip2011 普及組第 2 題
相關函數
STL:tolower();find();transform();isalnum();
輸入:cin;getline();
AC代碼
#include<bits/stdc++.h>
using namespace std;
int cnt,ans1;
string ch,atc;
void countcnt(string &ch,string &atc){
size_t pos=0;
while((pos=atc.find(ch,pos))!=string::npos){
bool left=(pos==0)||!isalnum(atc[pos-1]);
bool right=(pos+ch.size()==atc.size())||!isalnum(atc[pos+ch.size()]);
if(left&&right){
if(!cnt){
ans1=pos;
}
cnt++;
}
pos++;
}
}
int main(){
cin>>ch;
cin.ignore();
getline(cin,atc);
transform(ch.begin(),ch.end(),ch.begin(),[](unsigned char c){return tolower(c);});
transform(atc.begin(),atc.end(),atc.begin(),[](unsigned char c){return tolower(c);});
countcnt(ch, atc);
if(cnt==0){cout<<-1; return 0;}
cout<<cnt<<" "<<ans1<<endl;
return 0;
}

浙公網安備 33010602011771號