1 条题解
-
0
题目题解
问题理解
定义字符串 与正整数 的乘法为重复 次。
若存在 使得 ,则称 可被 整除。
是能同时被 和 整除的最短非空字符串。给定两个由
'a'和'b'组成的字符串 和 ,求 ,若不存在则输出-1。
第一步:必要条件
设 ,。
若 存在,设其长度为 ,则 必须是 和 的公倍数。
最小可能的 是 。因此, 的长度至少为 。
第二步:构造候选
将 重复 次,得到字符串 ,长度为 。
将 重复 次,得到字符串 ,长度也为 。若 ,则这个公共字符串就是 (因为它的长度最小且能被 和 整除)。
否则,不存在这样的字符串(因为任何能同时整除 和 的字符串的长度必须是 的倍数,而最短的可能长度已经检验,若不相等则不可能)。
第三步:正确性证明
- 若 存在,其长度必为 的倍数。取最小倍数 ,该字符串必须同时是 和 的重复拼接。由于 和 本身是周期串,该字符串必然等于 和 。因此 。
- 反之,若 ,则该字符串显然能被 和 整除,且长度最小。
第四步:时间复杂度
- 计算 :。
- 字符串构造:,但 ,完全可行。
代码实现
#include <bits/stdc++.h> using namespace std; string mul(const string& s, int k) { string res; for (int i = 0; i < k; i++) { res += s; } return res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { string s, t; cin >> s >> t; int n = s.size(), m = t.size(); int g = __gcd(n, m); string a = mul(s, m / g); string b = mul(t, n / g); if (a == b) { cout << a << "\n"; } else { cout << "-1\n"; } } return 0; }
验证样例
输入:
3 baba ba aa aaa aba ab输出:
baba aaaaaa -1与题目输出一致。
总结
本题的关键在于:
- 候选字符串长度必须是 。
- 将 和 分别重复到该长度,比较是否相等。
- 若相等,则其为 ;否则不存在。
- 1
信息
- ID
- 6341
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者