奥赛一本通 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;
}
posted @ 2026-09-23 11:37  萧西待水  阅读(10)  评论(0)    收藏  举报