P1308 統計單詞數
題目描述
一般的文本編輯器都有查找單詞的功能,該功能可以快速定位特定單詞在文章中的位置,有的還能統計出特定單詞在文章中出現的次數。
現在,請你編程實現這一功能,具體要求是:給定一個單詞,請你輸出它在給定的文章中出現的次數和第一次出現的位置。注意:匹配單詞時,不區分大小寫,但要求完全匹配,即給定單詞必須與文章
中的某一獨立單詞在不區分大小寫的情況下完全相同(參見樣例1 ),如果給定單詞僅是文章中某一單詞的一部分則不算匹配(參見樣例2 )。
輸入輸出格式
輸入格式:輸入文件名為stat.in ,2 行。
第1 行為一個字符串,其中只含字母,表示給定單詞;
第2 行為一個字符串,其中只可能包含字母和空格,表示給定的文章。
輸出格式:輸出文件名為stat.out 。
只有一行,如果在文章中找到給定單詞則輸出兩個整數,兩個整數之間用一個空格隔開,分別是單詞在文章中出現的次數和第一次出現的位置(即在文章中第一次出現時,單詞首字母在文章中的位置,位置從 0 開始);如果單詞在文章中沒有出現,則直接輸出一個整數-1。
輸入輸出樣例
To to be or not to be is a question
2 0
to Did the Ottoman Empire lose its power at that time
-1
說明
數據范圍
1≤ 單詞長度≤10。
1≤ 文章長度≤1,000,000。
noip2011普及組第2題
題目鏈接:https://www.luogu.org/problem/show?pid=1308
分析:這題卡的還是挺久的,半天不知道怎么處理單詞,主要還是看清題目要求的格式:一共只有兩行,第一行輸入字母小於等於10個的單詞(不可能會有空格),第二行輸入文本(可能會有前導的空格),非正常輸出-1(整數),正常輸出兩個整數(第一個為出現的次數,第二個為單詞開頭字母所占的位置,栽在這兒很長時間)。題目本身不難,關鍵是對於電腦讀入的文本格式的把握,為此建議使用cin.peek()與cin.get()函數。
下面給出AC代碼:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 char temp; 6 string str1,str2; 7 int len=0;//len為單個字母長度 8 int N=0,index=0;//N為單詞出現次數,index為第一次出現的位置, 9 cin>>str1; 10 while(cin.peek()!='\n')//去掉多余部分 11 { 12 cin.get(); 13 } 14 cin.get();//拿走換行符 15 for(int i=0;str1[i]!='\0';i++) 16 { 17 if(str1[i]>='A'&&str1[i]<='Z') 18 str1[i]+=-'A'+'a';//轉換為小寫 19 } 20 bool count=0;//標記 21 while(cin.peek()!='\n')//結束條件為在第二行末尾輸入了換行符 22 { 23 temp=cin.peek();//觀察現在位置是否為空格 24 if(temp==' ')//如果是空格就取走 25 { 26 cin.get(); 27 len++;//即便取走的是空格,位置也一定要加上 28 continue; 29 } 30 count=0; 31 cin>>str2; 32 len+=str2.size();//現在的位置 33 for(int i=0;str2[i]!='\0';i++) 34 { 35 if(str2[i]>='A'&&str2[i]<='Z') 36 str2[i]+=-'A'+'a';//轉換為小寫 37 } 38 if(str1==str2) 39 { 40 N++;//次數+1 41 count=1; 42 } 43 if(count&&N==1)//兩個邏輯條件保證index記錄的一定是第一次出現時的位置 44 index=len-str2.size(); 45 } 46 if(N==0) 47 cout<<N-1;//未找到輸出整數-1 48 else 49 cout<<N<<" "<<index;//輸出數據 50 return 0; 51 }
