標籤: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 }