描述
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
输入描述
输入数据为多组数据,读取到 # 字符时结束。每组数据仅有一行,为由空格分开的花布条和小饰条。花布条和小饰条都是用可见 ASCII 字符表示的,不会超过 1000 个字符。
注意:这个 # 应为单个字符。若某字符串开头有 #,不意味着读入结束!
输出描述
对于每组数据,输出一行一个整数,表示能从花纹布中剪出的最多小饰条个数。
样例输入 1
abcde a3 aaaaaa aa #
样例输出 1
0 3
数据范围与提示
对于全部数据,字符串长度 ≤1000。
本题参考代码
#include<bits/stdc++.h>
using namespace std;
char ch1[1005],ch2[1005];
int nxt[1005],len1,len2;
int KmpSearch(char* s,char* p){
int ans=0;
int len1=strlen(s),len2=strlen(p);
int i=0,j=0;
while(i<len1&&j<len2){
if(j==-1||s[i]==p[j]){
i++; j++;
}else{
j=nxt[j];
}
if(j==len2){
ans++;
j=0;
}
}
return ans;
}
void GetNext(char* p,int nxt[]){
int len2=strlen(p);
int j=0,k=-1;//细节1 k的初始值
nxt[0]=-1;//细节2 边界条件
while(j<len2-1){ //细节3 j的范围
if(k==-1||p[k]==p[j]){
k++;j++;
nxt[j]=k;
}else k=nxt[k];
}
}
int main(){
while("爆肝KMP"){
cin>>ch1;
len1=strlen(ch1);
if(ch1[0]=='#'&&len1==1) break;
cin>>ch2;
len2=strlen(ch2);
GetNext(ch2,nxt);
cout<<KmpSearch(ch1,ch2)<<endl;
}
}
301

被折叠的 条评论
为什么被折叠?



