剪花布条 HDU

剪花布条 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
",kmp());
40     }
41     return 0;
42 }
原文地址:https://www.cnblogs.com/hehe54321/p/hdu-2087.html