奥赛一本通 1465 剪花布条
1465 剪花布条
题目大意
给定一个字符串,问它至多包含多少个互不重叠的另一个字符串。
知识要点
KMP
解题思路
在 KMP 算法从左往右匹配的过程中,一旦发现了模式串,就可以立即确定下来,同时将模式串的指针回退到 0,相当于重新开始做下一轮匹配。
参考代码
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
char s[N], t[N];
int f[N];
int main() {
while(1) {
scanf("%s",t);
if(t[0]=='#'&&t[1]==0) break;
scanf("%s",s);
int ans = 0, m = strlen(s), n = strlen(t);
for(int i = 1, j = 0; i < m; i++) {
while(j && s[i] != s[j]) j = f[j - 1];
if(s[i] == s[j]) j++;
f[i] = j;
}
for(int i = 0, j = 0; i < n; i++) {
while(j && t[i] != s[j]) j = f[j - 1];
if(t[i] == s[j]) j++;
if(j == m) ans++, j = 0;
}
printf("%d\n", ans);
}
return 0;
}

浙公网安备 33010602011771号