題目描述
一般的文本編輯器都有查找單詞的功能,該功能可以快速定位特定單詞在文章中的位置,有的還能統計出特定單詞在文章中出現的次數。
現在,請你編程實現這一功能,具體要求是:給定一個單詞,請你輸出它在給定的文章中出現的次數和第一次出現的位置。注意:匹配單詞時,不區分大小寫,但要求完全匹配,即給定單詞必須與文章
中的某一獨立單詞在不區分大小寫的情況下完全相同(參見樣例1 ),如果給定單詞僅是文章中某一單詞的一部分則不算匹配(參見樣例2 )。
輸入輸出格式
輸入格式:
共22行。
第11行為一個字符串,其中只含字母,表示給定單詞;
第22行為一個字符串,其中只可能包含字母和空格,表示給定的文章。
輸出格式:
一行,如果在文章中找到給定單詞則輸出兩個整數,兩個整數之間用一個空格隔開,分別是單詞在文章中出現的次數和第一次出現的位置(即在文章中第一次出現時,單詞首字母在文章中的位置,位置從00 開始);如果單詞在文章中沒有出現,則直接輸出一個整數-1−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≤1≤單詞長度≤10≤10。
1≤1≤文章長度≤1,000,000≤1,000,000。
noip2011普及組第2題
本題處理思路:
1.0想法:由於題目看錯,誤認為輸出整個單詞位置,所以將這段文章的每一個單詞提取出來,放在一個二維字符數組中然后掃描一遍找出第一個單詞的位置,結果瞎貓碰個死耗子,撞對了3個點
2.0想法:介於題目的讀錯,必須重新找思路,借鑒大量資料后,得到新的想法。枚舉文章的每一個字符,若其中一段的每一個字符都和要查找單詞相同,那么就有可能是的,接着做下一步判斷,以免它是一個單詞的一部分,最終AC了
#include<cstdio> #include<cstring> #include<cctype> using namespace std; char word[21],art[1000001]; int main() { gets(word);gets(art); int lenw=strlen(word),lena=strlen(art),p=0,ans=0,pos; bool flag=true; while(p<lena)//從文章的開頭枚舉每一個字符 { for (int i=0;i<lenw;++i) { if(toupper(art[p+i])!=toupper(word[i])) //若有一個不相等,就標記flag為false { flag=false; break; } } if(flag) //若每一個字符都能對上 { if((art[p-1]==' '&&art[p+lenw]==' ')||p==0&&art[p+lenw]==' ')//判斷它是不是這個單詞的一部分,★★★注:不要忘記考慮開頭就可以對上的情況 { ans++; if(ans==1) pos=p; p++; p+=lenw; //這以后的字符都可跳過(優化) } else p++; //巨坑:開始由於沒加這條語句,導致當flag為true且 if((art[p-1]==' '&&art[p+lenw]==' ')||p==0&&art[p+lenw]==' ')為假時p值不變化,十分尷尬地陷入死循環 } else p++; //若有一個不匹配,就換下一個 flag=true; //一個部分判斷完,不要忘記 } if(ans==0) printf("-1"); else printf("%d %d",ans,pos); }