4187. 剪花布条(KMP)
题目描述
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。
对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
输入格式
输入数据为多组数据,读取到 # 字符时结束。
每组数据仅有一行,为由空格分开的花布条和小饰条。花布条和小饰条都是用可见 A S C I I ASCII ASCII 字符表示的,不会超过 1000 1000 1000 个字符。
注意:这个 # 应为单个字符。若某字符串开头有 #,不意味着读入结束!
输出格式
对于每组数据,输出一行一个整数,表示能从花纹布中剪出的最多小饰条个数。
数据范围
对于全部数据,字符串长度 ≤ 1000 ≤1000 ≤1000。
下标从1开始的写法
测试用例
输入样例 1:
abcde a3
aaaaaa aa
#
输出样例 1:
0
3
输入样例 2:
abcdecfg a12a
aabbaa ab
##bvbb#c #b
sswq13zfrg s
#
输出样例 2:
0
1
1
2
输入样例 3:
vgdbiyenck di
jbd5639ydbbdn bd
bbdggsabazbbs bb
nvnv###dnunv nv
#
输出样例 3:
0
2
2
3
输入样例 4:
abbbbaaabbabbssshh bb
bhbhbhhaabhbhbd bh
#d#d#fg5664778134 d#
#
输出样例 4:
4
5
2
输入样例 5:
vvvfffeefvffvfv fv
hggvhgdchgxs hg
ll##s##s44#s#sa#a #s#
0978676745647yhh 67
#
输出样例 5:
3
3
2
2
代码内容(下标从0开始的写法)
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
typedef long long ll;
const ll N=1e6+10;
ll ne[N];
int main()
{
ll n,m;
string s,p;
while(1)
{
cin>>s;
if(s[0]=='#'&&s[1]=='\0')
break;
n=s.size();
cin>>p;
m=p.size();
memset(ne,0,sizeof 0);//初始化
//求next的过程
ne[0]=-1;
for(ll i=1,j=-1;i<m;i++)
{
while(j>=0&&p[i]!=p[j+1]) j=ne[j];
if(p[i]==p[j+1]) j++;
ne[i]=j;
}
// kmp 匹配过程
ll index=0;
for(ll i=0,j=-1;i<n;i++)
{
while(j>=0&&s[i]!=p[j+1]) j=ne[j];
if(s[i]==p[j+1]) j++;
if(j==m-1)
{
index++;
//j=ne[j];//有重合
j=-1;//不能有重合
}
}
cout<<index<<endl;
}
return 0;
}