题目描述
原题来自:HDU 2087
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
输入格式
输入数据为多组数据,读取到
#
字符时结束。每组数据仅有一行,为由空格分开的花布条和小饰条。花布条和小饰条都是用可见 ASCII 字符表示的,不会超过 10001000 个字符。
注意:这个 #
应为单个字符。若某字符串开头有 #
,不意味着读入结束!
输出格式
对于每组数据,输出一行一个整数,表示能从花纹布中剪出的最多小饰条个数。
样例
Input | Output |
---|---|
abcde a3 aaaaaa aa # | 0 3 |
数据范围与提示
对于全部数据,字符串长度 \leq 1000≤1000。
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
string s1,s2;
int n1,n2,a[N],res;
void get_next()
{
int i=0,j=-1;
a[0]=-1;
while(i<n2)
{
if(j==-1||s2[i]==s2[j])
i++,j++,a[i]=j;
else
j=a[j];
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
while(cin >> s1 >> s2,s1!="#")
{
n1=s1.size(),n2=s2.size();
get_next();
res=0;
int i=0,j=0;
while(i<n1)
{
if(j==-1||s1[i]==s2[j])
i++,j++;
else
j=a[j];
if(j>=n2)
res++,j=0;//j=0不重用原来的一些数据
}
cout << res << endl;
}
return 0;
}