HDU2087 剪花布条
Posted autoint
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU2087 剪花布条相关的知识,希望对你有一定的参考价值。
题意
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
给两个字符串s,t,问将s按照适当的方式切割后,最多能得到几个串t?
分析
参照jklover的题解。
这里考虑不使用hash的做法.
在字符串s中找t,用kmp即可.需要注意的是前后两次的串不能相交,因为两者不能被同时取到.
匹配的同时记录一下上一个匹配位置即可.kmp中,若j=|t|,那么此时的i恰好为这组匹配的起点.
时间复杂度?大材小用了。这题的数据范围暴力都能过。
代码
#include<cstdio>
#include<iostream>
#include<cstring>
#define rg register
#define il inline
#define co const
template<class T>il T read()
{
rg T data=0;
rg int w=1;
rg char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
{
data=data*10+ch-'0';
ch=getchar();
}
return data*w;
}
template<class T>il T read(rg T&x)
{
return x=read<T>();
}
typedef long long ll;
co int N=1e3+1;
char s[N],t[N];
int f[N];
int n,m;
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
while(1)
{
scanf("%s",s);
if(s[0]=='#')
break;
n=strlen(s);
scanf("%s",t);
m=strlen(t);
int lp=-1,ans=0;
f[0]=f[1]=0;
for(int i=1;i<n;++i)
{
int j=f[i];
while(j&&s[j]!=s[i])
j=f[j];
f[i+1]=s[j]==s[i]?j+1:0;
}
int j=0;
for(int i=0;i<n;++i)
{
while(j&&s[i]!=t[j])
j=f[j];
if(s[i]==t[j])
++j;
if(j==m&&i-m>=lp)
{
lp=i;
++ans;
}
}
printf("%d
",ans);
}
return 0;
}
以上是关于HDU2087 剪花布条的主要内容,如果未能解决你的问题,请参考以下文章