CodeForces 314 B.Sereja and Periods(dp)

202 篇文章 1 订阅

Description

定义记号 [x,n]=x+x+...+x=i=1nx ,其中 x 是一个字符串,n是一个正整数, + 表示字符串连接,例如[abc,2]=abcabc,如果从字符串 t 中删除若干字符后变成字符串s,则称字符串 s 可以从字符串t中得到,给出两个字符串 w=[a,b],q=[c,d] ,找到最大的 p0 ,使得 [q,p] 可以从 w 中得到

Input

首先输入两个整数b,d,然后输入两个字符串 a c (1b,d107,|a|,|c|100)

Output

输出满足条件的最大正整数 p ,如果不存在则输出0

Sample Input

10 3

abab

bab

Sample Output

3

Solution

dp[s] 表示从 c 串的s位置开始和一个 a 串匹配可以匹配多少个c串, Next[s] 表示从 c 串的s位置开始和一个 a 串匹配最后失配的位置,枚举s求出 dp Next 值,根据这两个值可以知道 b a串可以匹配的 c 串数量num,则 p=numd

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 111
char a[maxn],c[maxn];
int b,d,la,lc,dp[maxn],Next[maxn];
void deal(int s)
{
    dp[s]=0,Next[s]=s;
    for(int i=0;i<la;i++)
        if(a[i]==c[Next[s]])
        {
            Next[s]++;
            if(Next[s]==lc)Next[s]=0,dp[s]++;
        }
}
int main()
{
    while(~scanf("%d%d",&b,&d))
    {
        scanf("%s%s",a,c);
        la=strlen(a),lc=strlen(c);
        for(int i=0;i<lc;i++)deal(i);
        int num=0,s=0;
        while(b--)
        {
            num+=dp[s];
            s=Next[s];
        }
        printf("%d\n",num/d);
    } 
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值