HDU 2087 (KMP不可重叠的匹配) 花布条

题意:

用两个字符串分别表示布条和图案,问能从该布条上剪出多少这样的图案。

分析:

毫无疑问这也是用KMP匹配,关键是一次匹配完成后,模式串应该向后滑动多少。

和上一题 HDU 1686 不同,两个图案肯定不能在母串中有交叉的部分,所以当匹配成功一次后,应当滑动整个模式串的长度。

和上一题比,代码几乎不变,只是

j = next[j]; 变为 j = 0;

 1 #include <cstdio>

 2 #include <cstring>

 3 

 4 const int maxn = 1000 + 10;

 5 char p[maxn], q[maxn];

 6 int next[maxn]; 

 7 

 8 void get_next(char* p, int l)

 9 {

10     int j = 0, k = -1;

11     next[0] = -1;

12     while(j < l)

13     {

14         if(k == -1 || p[k] == p[j])

15         {

16             k++;

17             j++;

18             next[j] = k;

19         }

20         else k = next[k];

21     }

22 }

23 

24 int KMP(char* p, int lenp, char* q, int lenq)

25 {

26     int i = 0, j = 0, ans = 0;

27     while(i < lenp)

28     {

29         if(j == -1 || p[i] == q[j])

30         {

31             i++;

32             j++;

33         }

34         else j = next[j];

35         if(j == lenq)

36         {

37             ans++;

38             j = 0;

39         }

40     }

41     return ans;

42 }

43 

44 int main(void)

45 {

46     //freopen("2087in.txt", "r", stdin);

47     

48     while(scanf("%s", p) == 1)

49     {

50         if(p[0] == '#') break;

51         

52         memset(next, 0, sizeof(next));

53         scanf("%s", q);

54         int lenp = strlen(p);

55         int lenq = strlen(q);

56         get_next(q, lenq);

57         printf("%d\n", KMP(p, lenp, q, lenq));

58     }

59     

60     return 0;

61 }
代码君

 

你可能感兴趣的:(HDU)