计算重复(倍增优化dp)

定义 conn(s,n)conn(s,n) 为 n 个字符串 s 首尾相接形成的字符串,例如:

conn(“abc”,2)=”abcabc”

称字符串 a 能由字符串 b 生成,当且仅当从字符串 b 中删除某些字符后可以得到字符串 a。

例如“abdbec”可以生成“abc”,但是“acbbe”不能生成“abc”。

给定两个字符串 s1 和 s2,以及两个整数 n1 和 n2,求一个最大的整数 m,满足conn(conn(s2,n2),m)能由 conn(s1,n1)生成。

输入格式

输入包含多组测试数据。

每组数据由2行组成,第一行包含s2,n2,第二行包含s1,n1。

输出格式

对于每组数据输出一行表示答案m。

数据范围

s1 和 s2 长度不超过100,n1 和 n2 不大于 106。

输入样例:

ab 2
acb 4
acb 1
acb 1
aa 1
aaa 3
baab 1
baba 11
aaaaa 1
aaa 20

输出样例:

2
1
4
7
12

题意:求最大的整数m,使得(n1个s1) 的子序列中能找到(m个n2个s2),即:(m个n2个s2)能由(n1个s1)生成。

思路:

构造一个由无限个s1依次首尾相连的串

f[i][j]表示以s1[i]为起点,包含2^j个s2的最短的一段的步数  (因为要使个数最多,所以每一段要尽可能短)

因为在求个数时,需要找到每次求完一段完成的终点作为下一次

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值