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 剪花布条的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2087 剪花布条

hdu2087剪花布条(KMP)

C - 剪花布条 HDU-2087

HDU 2087: 剪花布条

HDU 2087: 剪花布条

HDU2087 剪花布条(KMP)