首页 > 代码库 > HDU 2087 (KMP不可重叠的匹配) 花布条

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 2087 (KMP不可重叠的匹配) 花布条