題目:http://poj.org/problem?id=3461
題目大意:
題目的大意是:在一個串W中找出串T出現的次數,串T可以再W中重疊出現,即 W="AZA",T="AZAZAZA",可以出現的形式有 AZA ZAZA,AZ AZA ZA,AZAZ AZA。
/* kmp裸題 */ #include<cstdio> #include<string> #include<iostream> using namespace std; int p[100001],n; string a,b; int main(){ scanf("%d",&n); for(int q=1;q<=n;q++) { cin>>b>>a; int x=a.length(),y=b.length(); a=" "+a;b=" "+b; int j=0; for(int i=2;i<=y;i++) { while(j>0&&b[j+1]!=b[i]) j=p[j];//從b[j+1]開始找與b[i]相同的字母 if(b[j+1]==b[i]) j++; p[i]=j;//如果找到相同字母,p[i]記錄此位置,否則p[i]=p[i-1] } j=0; int ans=0; for(int i=1;i<=x;i++) { while(j>0&&b[j+1]!=a[i]) j=p[j];//按p[j]後退找出與a[i]相同的b[j+1] if(b[j+1]==a[i]) j++;//如果找到則向後前進 if(j==y) ans++;//如果在t中找到完整的b +1 } printf("%d\n",ans); } return 0; }