1. 程式人生 > 實用技巧 >Oulipo POJ - 3461

Oulipo POJ - 3461

題目:查詢一個模式串在其他串中出現的次數

KMP演算法詳解連結:https://blog.csdn.net/qq_37969433/article/details/82947411

 1 #include<iostream>
 2 #include<map>
 3 #include<string.h>
 4 using namespace std;
 5 #define MAXN 1000059
 6 string t,s;
 7 int l1,l2;
 8 int nxt[MAXN];
 9 void getnxt(){
10     int j=0,k=-1;
11     nxt[0
]=-1; 12 while(j<l2){ 13 if(k==-1||t[j]==t[k]){ 14 nxt[++j]=++k; 15 } 16 else{ 17 k=nxt[k]; 18 } 19 } 20 } 21 int kmp(){ 22 int ans=0; 23 int j=0; 24 if(l1==1&&l2==1){ 25 if(s[0]==t[0]){ 26 return 1
; 27 } 28 return 0; 29 } 30 getnxt(); 31 for(int i=0;i<l1;i++){ 32 //直到找到第一個適配首字母 33 while(j>0&&s[i]!=t[j]){ 34 j=nxt[j]; 35 } 36 if(s[i]==t[j]){ 37 j++; 38 } 39 if(j==l2){ 40 ans++;
41 j=nxt[j]; 42 } 43 } 44 return ans; 45 } 46 int main(){ 47 ios::sync_with_stdio(0); 48 cin.tie(0); 49 int T; 50 cin>>T; 51 while(T--){ 52 cin>>t>>s; 53 l1=s.size(); 54 l2=t.size(); 55 cout<<kmp()<<endl; 56 } 57 return 0; 58 }