http://acm.hdu.edu.cn/showproblem.php?pid=2087
算是模板题吧,找到一个子串之后将模板串指针归零否则会重复计算。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int nex[1010]; 4 char s[1005],t[1005]; 5 void kmp() 6 { 7 int szs=strlen(s),szt=strlen(t),i,j,k; 8 nex[0]=nex[1]=0; 9 for(i=1;i<szt;++i) 10 { 11 j=nex[i]; 12 while(j&&t[i]!=t[j]) j=nex[j]; 13 nex[i+1]=t[i]==t[j]?j+1:0; 14 } 15 int ans=0; 16 j=0; 17 for(i=0;i<szs;++i) 18 { 19 while(j&&s[i]!=t[j]) j=nex[j]; 20 if(s[i]==t[j]){ 21 if(j+1==szt){j=0;ans++;} 22 else j++; 23 } 24 } 25 printf("%d ",ans); 26 } 27 int main() 28 { 29 while(scanf("%s",s)!=EOF){ 30 if(!strcmp(s,"#")) break; 31 scanf("%s",t); 32 kmp(); 33 } 34 }