統計單詞數(NOIP2011)


題目描述

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

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

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

輸入輸出格式

輸入格式:

 共22行。

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

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

 輸出格式:

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

 

輸入輸出樣例

輸入樣例#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≤1≤單詞長度≤1010。

1≤1≤文章長度≤1,000,0001,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);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM