码迷,mamicode.com
首页 > 其他好文 > 详细

HDU2087 剪花布条

时间:2019-01-26 15:20:18      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:需要   long   lin   记录   ios   %s   .com   i+1   ++i   

题意

一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?

给两个字符串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\n",ans);
    }
    return 0;
}

HDU2087 剪花布条

标签:需要   long   lin   记录   ios   %s   .com   i+1   ++i   

原文地址:https://www.cnblogs.com/autoint/p/10323394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!