【poj 3461】Oulipo(字符串--KMP)
题意:求子串在文本串中出现了多少次。
解法:使用KMP的next[ ]和tend[ ]数组计数。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 const int N=10010,M=1000010; 8 char s[N],ss[M]; 9 int n,m; 10 int next[N];//,tend[M]; 11 12 void kmp() 13 { 14 memset(next,0,sizeof(next)); 15 int p=0; 16 next[1]=0; 17 for (int i=2;i<=n;i++) 18 { 19 while (s[i]!=s[p+1] && p) p=next[p]; 20 if (s[i]==s[p+1]) p++; 21 next[i]=p; 22 } 23 //memset(tend,0,sizeof(tend)); 24 int cnt=0; p=0; 25 for (int i=1;i<=m;i++) 26 { 27 while (ss[i]!=s[p+1] && p) p=next[p]; 28 if (ss[i]==s[p+1]) p++; 29 //tend[i]=p; 30 if (p==n) cnt++; 31 } 32 printf("%d\n",cnt); 33 } 34 int main() 35 { 36 int T; 37 scanf("%d",&T); 38 while (T--) 39 { 40 scanf("%s%s",s+1,ss+1); 41 n=strlen(s+1),m=strlen(ss+1); 42 kmp(); 43 } 44 return 0; 45 }