【KMP】剪花布条
问题 K: 【KMP】剪花布条
时间限制: 1 Sec 内存限制: 128 MB
提交: 16 解决: 12
[提交] [状态] [讨论版] [命题人:admin]
题目描述
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
输入
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
输出
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
样例输入
abcde a3
aaaaaa aa
#
样例输出
0 3
#include <bits/stdc++.h> using namespace std; int Next[10000]; char t[10000]; //主串 char p[10000]; //模式串 int lenp,lent; void get_next() { int i,j; Next[0] = j = -1; i = 0; while(i<lenp) //最后一位的判断其实是多余的 { while(j!=-1&&p[j]!=p[i]) j = Next[j]; Next[++i] = ++j; } } int kmp3() //返回t串中有多少个p串 { int i,j; i = j = 0; int ans = 0; while(i<lent) { while(j!=-1&&t[i]!=p[j]) j = Next[j]; if(j==lenp-1) { ans++; j = -1; // j指针改变为-1 然后++ 从0重新查找 } i++; j++; } return ans; } int main() { while(scanf("%s",t)) { if(strcmp(t,"#")==0) break; scanf("%s",p); lenp = strlen(p); lent = strlen(t); get_next(); int ans = kmp3(); cout<<ans<<endl; } return 0; }