剪花布条 HDU - 2087
要求各个匹配出来的子串不重叠的kmp。实际上直接贪心从前往后找,每找到一个就把当前j标为0即可。(一般kmp是标为f[j])
1 #include<cstdio> 2 #include<cstring> 3 int f[1010]; 4 char s[1010]; 5 char s2[1010]; 6 int m,n; 7 void getf() 8 { 9 int i=0,j=f[0]=-1; 10 while(i<m) 11 { 12 while(j>=0&&s[i]!=s[j]) j=f[j]; 13 i++;j++; 14 f[i]=s[i]==s[j]?f[j]:j; 15 } 16 } 17 int kmp() 18 { 19 int i=0,j=0,ans=0; 20 while(i<n) 21 { 22 while(j>=0&&s[j]!=s2[i]) j=f[j]; 23 i++;j++; 24 if(j==m) 25 { 26 ans++; 27 j=0; 28 } 29 } 30 return ans; 31 } 32 int main() 33 { 34 while(scanf("%s%s",s2,s)==2) 35 { 36 m=strlen(s); 37 n=strlen(s2); 38 getf(); 39 printf("%d\n",kmp()); 40 } 41 return 0; 42 }