HDU1686 計算模式串匹配的次數

來源:互聯網
上載者:User

標籤:style   blog   color   使用   os   資料   

題目大意:

輸入一個T,表示有T組測試資料;

每組測試資料包括一個字串W,T,T長度大於W小於1000000,w長度小於10000,計算W匹配到T中成功的次數;

 

這題很明顯要用KMP演算法,不然很容易逾時,但在使用kmp演算法時也要注意,我第一次將匹配成功的位置得到後,迴圈進入kmp演算法,從前一個匹配到的位置開始算起,但是逾時了。後來問完學長之後,清楚了,沒必要迴圈進入kmp,直接一次可以搞定,每次模式串匹配到末尾時,都將計數+1,然後根據next[m],重新得到j繼續與原串進行匹配直到進行到原串結束。

 

代碼如下:

 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 using namespace std; 6  7 char b[10100]; 8 char a[1000100]; 9 int next[10100];10 int n,m,count;11 12 void getNext(char *b)13 {14     int j;15     next[0]=0,next[1]=0;16     for(int i=1;i<m;i++){17         j=next[i];18         while(j&&b[j]!=b[i]) j=next[j];19         if(b[j]==b[i]) next[i+1]=j+1;20         else next[i+1]=0;21     }22 }23 24 void kmp(char *a,char *b,int *next)25 {26     int j=0;27     for(int i=0;i<n;i++){28 29         while(j&&a[i]!=b[j]) j=next[j];30         if(a[i]==b[j]) j++;31         if(j==m) count++,j=next[j];32     }33 }34 35 int main()36 {37     int T;38     cin>>T;39     while(T--){40         count=0;41         string W,T;42         cin>>W>>T;43         n=T.size();44         m=W.size();45         for(int i=0;i<n;i++){46             a[i]=T.at(i);47         }48         for(int i=0;i<m;i++){49             b[i]=W.at(i);50         }51 52         getNext(b);53         kmp(a,b,next);54         cout<<count<<endl;55     }56     return 0;57 }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.