好的,收到建议。以后我会在题目描述中确保包含样例解释。
题目描述
定义 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。
样例
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
样例解释
第一组数据:
s2="ab", n2=2 → conn(s2,n2)="abab"
s1="acb", n1=4 → conn(s1,n1)="acbacbacbacb"
我们看能由它生成多少个 conn(s2,n2) 连接。
- m=2:要生成 "abab"+"abab"="abababab"
可以在 conn(s1,n1) 中按顺序挑出 "a c b a c b a c b a c b" 里的某些字符得到 "abababab"(挑第 1,3,4,6,7,9,10,12 个字符)。
- m=3 则需生成 "abab"×3 长度 12,但 s1 里 c 不能组成 b,若全挑 a,b 则不够,检验可知不行。
所以答案是 2。
第二组数据:
s2="acb", n2=1 → 就是 "acb"
s1="acb", n1=1 → 也是 "acb"
可以直接从 s1 生成 s2,m=1,即 conn(s2,1) 本身。
此时 conn(s2,1) 等于 s2,显然能由 s1 生成。
m 最大为 1,因为 conn(s1,1) 长度 3,无法包含两个 s2(需 6 个字符)。
答案是 1。
第三组数据:
s2="aa", n2=1 → "aa"
s1="aaa", n1=3 → $conn(s_1,3)=\text{"aaa"}\times 3 = \text{"aaaaaaaaa"}$(长度 9)
需要尽可能多生成 "aa" 的连接串。
每个 "aa" 需要两个 a,conn(s1,3) 中恰好 9 个 a,最多能生成 9/2=4 个 "aa",并且顺序可以满足。
m=4 时,需要生成 "aa"×4="aaaaaaaa"(长度 8),可以从 conn(s1,3) 中挑 8 个 a 得到。
所以 m 最大为 4。
第四组数据:
s2="baab", n2=1 → 一个 "baab" 长度为 4。
s1="baba", n1=11 → conn(s1,11) 长度为 4×11=44。
需要找到最多能生成多少个 conn(s2,n2) 即 "baab"。
每个 "baab" 需要 b a a b 的顺序。在 conn(s1,11) 中,每 4 个字符 b a b a,含 b 两个、a 两个,而 "baab" 需要 b(1) a(2) b(1),因此需跨单元匹配。通过贪心匹配计算得最多 7 个。
所以 m=7。
第五组数据:
s2="aaaaa", n2=1 → 长度为 5 的全 a 串。
s1="aaa", n1=20 → conn(s1,20) 长度为 60,全部是 a。
需要生成 m 个 s2 连起来,即长度 5m 的全 a 串,显然只要 5m≤60 即可,因此 m≤12。
所以 m 最大为 12。
数据范围
- s1 和 s2 的长度均不超过 100;
- n1,n2≤106;
- 输入总长度(所有字符串和数字总和)不超过 104,但 conn(s1,n1) 的长度理论可达 108 量级,故不能显式构造;
- 需要设计 O(∣s1∣⋅∣s2∣) 的预处理与 O(logn1) 或 O(1) 每步查询的算法;
- 时间限制:1 秒
- 空间限制:64 MB