剪花布条
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6230 Accepted Submission(s): 4139
Problem Description
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3 aaaaaa aa #
Sample Output
0 3
Author
qianneng
Source
Recommend
lcy
code:
#include<iostream>
#include<cstring>
using namespace std;
char s[2005],t[2005];
int next[2005];
char t1[2005];
void get_next()
{
int i=0,j=-1;
next[0]=-1;
while (i<strlen(t))
{
if (j==-1||t[i]==t[j])
{
++i,++j;
next[i]=j;
}
else
j=next[j];
}
}
int kmp()
{
int i=0,j=0;
int sum=0;
get_next();
/*
for(int i=0;i<strlen(t);i++)
{
cout<<next[i]<<" ";
}
cout<<endl;*/
while (i<int(strlen(s))&&j<int(strlen(t)))//这回真的涨见识了,居然strlen前还需要一个int强制转换
{
if (j==-1||s[i]==t[j])
{
++i,++j;
// cout<<i<<" "<<j<<endl;
}
else
{
j=next[j];
// cout<<j<<" j "<<endl;
}
if (j==int(strlen(t)))
{
sum++;
j=0;
}
//cout<<sum<<endl;
}
if (i==int(strlen(s))&&j==int(strlen(t)))
{
sum++;
}
return sum;
}
int main()
{
int num[10005];
while (1)
{
scanf("%s",s);
getchar();
if (s[0]=='#')
break;
memset(t1,0,sizeof(t1));
memset(t,0,sizeof(t));
scanf("%s",&t);
getchar();
int k=0;
for (int i=0;i<strlen(t1);i++)
{
if (t1[i]<='z'&&t1[i]>='a')
{
t[k++]=t1[i];
}
else
{
for (int j=1;j<int(t1[i])-'0';j++)
{
t[k++]=t1[i-1];
}
}
}
cout<<kmp()<<endl;;
}
return 0;
}