剪花布条
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6341 Accepted Submission(s): 4225
Problem Description
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3 aaaaaa aa #
Sample Output
0 3
Author
qianneng
Source
Recommend
lcy
要求主串中不重叠的包含模式串的次数。可用KMP算法统计,注意与可以重叠的区别。
1.可以重叠时if(j==wslen)j=next[j]
2.不可重叠时if(j==wslen)j=0
由于数据比较小,可以直接用库函数strstr做。
用库函数strstr解题
#include<iostream>
#include<cstdio>
#include<cstring>
const int MAXN=1000+1000;
char W[MAXN],T[MAXN];//W为模式串,T为主串
int main()
{
int i,ans;
while(~scanf("%s",T))
{
if(strcmp(T,"#")==0)
break;
scanf("%s",W);
ans=0;
int wlen=strlen(W);
char *start=T,*pos;
while((pos=strstr(start,W))!=NULL)
{
start=pos+wlen;
ans++;
}
printf("%d\n",ans);
}
return 0;
}
KMP算法解题
#include<iostream>
#include<cstdio>
#include<cstring>
const int MAXN=1000+1000;
char W[MAXN],T[MAXN];//W为模式串,T为主串
int next[MAXN];
//KMP算法中计算next[]数组
void getNext(char *p)
{
int j,k,len=strlen(p);
j=0;
k=-1;
next[0]=-1;
while(j<len)
{
if(k==-1||p[j]==p[k])
{
next[++j]=++k;
}
else k=next[k];
}
}
//KMP算法统计模式串W在主串T中出现的次数
int KMP_count(char *W,char *T)
{
int i,wlen=strlen(W),tlen=strlen(T),j=0,ans=0;
//memset(next,0,sizeof(next));
getNext(W);
for(i=0;i<tlen;i++)
{
while(j>0&&T[i]!=W[j])
j=next[j];
if(W[j]==T[i])
j++;
if(j==wlen)
{
ans++;
j=0;
}
}
return ans;
}
int main()
{
while(~scanf("%s",T))
{
if(strcmp(T,"#")==0)
break;
scanf("%s",W);
//change(W1,W);
//change(T1,T);
printf("%d\n",KMP_count(W,T));
}
return 0;
}