一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
输入格式
输入数据为多组数据,读取到 #
字符时结束。每组数据仅有一行,为由空格分开的花布条和小饰条。花布条和小饰条都是用可见 ASCII 字符表示的,不会超过 10001000 个字符。
注意:这个 #
应为单个字符。若某字符串开头有 #
,不意味着读入结束!
输出格式
对于每组数据,输出一行一个整数,表示能从花纹布中剪出的最多小饰条个数。
样例
Inputcopy | Outputcopy |
---|---|
abcde a3 aaaaaa aa # | 0 3 |
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char s[1005],p[1005];
int ne[1005];
int n,m;
int main(){
while(1){
int ans=0;
s[0]='0';//设置一下s【0】来方便计算字符串长度
cin>>s+1;//下标从1开始
n=strlen(s)-1;//减去0
if(s[1]!='#'||s[1]=='#'&&n!=1){
memset(ne,0,sizeof(ne));//初始化ne
p[0]='0';
cin>>p+1;
m=strlen(p)-1;
//算ne数组
for(int i=2,j=0;i<=m;i++){//下标从2开始并且长度是子串长度
while(j&&p[i]!=p[j+1])j=ne[j];
if(p[i]==p[j+1])j++;
ne[i]=j;
}
//从1开始遍历s
for(int i=1,j=0;i<=n;i++){
while(j&&s[i]!=p[j+1])j=ne[j];
if(s[i]==p[j+1])j++;
if(j==m){//当j==子串的长度时
ans++;//说明有一个子串出现,数量加1
j=0;//当有子串出现因为要算剪出来的短数,所以下次判断从子串的头开始
}
}
printf("%d\n",ans);
}else break;
}
return 0;
}
核心:找ne数组,判断找到子串后应该进行的操作。