1 条题解

  • 0
    @ 2026-4-3 17:28:44

    题目题解

    问题理解

    定义字符串 aa 与正整数 xx 的乘法为重复 xx 次。
    若存在 xx 使得 bx=ab \cdot x = a,则称 aa 可被 bb 整除。
    LCM(s,t)\operatorname{LCM}(s, t) 是能同时被 sstt 整除的最短非空字符串。

    给定两个由 'a''b' 组成的字符串 sstt,求 LCM(s,t)\operatorname{LCM}(s, t),若不存在则输出 -1


    第一步:必要条件

    n=sn = |s|m=tm = |t|
    LCM(s,t)\operatorname{LCM}(s, t) 存在,设其长度为 LL,则 LL 必须是 nnmm 的公倍数。
    最小可能的 LLlcm(n,m)=nmgcd(n,m)\mathrm{lcm}(n, m) = \frac{n \cdot m}{\gcd(n, m)}

    因此,LCM(s,t)\operatorname{LCM}(s, t) 的长度至少为 lcm(n,m)\mathrm{lcm}(n, m)


    第二步:构造候选

    ss 重复 mgcd(n,m)\frac{m}{\gcd(n, m)} 次,得到字符串 SS',长度为 lcm(n,m)\mathrm{lcm}(n, m)
    tt 重复 ngcd(n,m)\frac{n}{\gcd(n, m)} 次,得到字符串 TT',长度也为 lcm(n,m)\mathrm{lcm}(n, m)

    S=TS' = T',则这个公共字符串就是 LCM(s,t)\operatorname{LCM}(s, t)(因为它的长度最小且能被 sstt 整除)。
    否则,不存在这样的字符串(因为任何能同时整除 sstt 的字符串的长度必须是 lcm(n,m)\mathrm{lcm}(n, m) 的倍数,而最短的可能长度已经检验,若不相等则不可能)。


    第三步:正确性证明

    • LCM(s,t)\operatorname{LCM}(s, t) 存在,其长度必为 lcm(n,m)\mathrm{lcm}(n, m) 的倍数。取最小倍数 lcm(n,m)\mathrm{lcm}(n, m),该字符串必须同时是 sstt 的重复拼接。由于 sstt 本身是周期串,该字符串必然等于 SS'TT'。因此 S=TS' = T'
    • 反之,若 S=TS' = T',则该字符串显然能被 sstt 整除,且长度最小。

    第四步:时间复杂度

    • 计算 gcd\gcdO(logmin(n,m))O(\log \min(n, m))
    • 字符串构造:O(lcm(n,m))O(nm)O(\mathrm{lcm}(n, m)) \le O(n \cdot m),但 n,m20n, m \le 20,完全可行。

    代码实现

    #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. 候选字符串长度必须是 lcm(s,t)\mathrm{lcm}(|s|, |t|)
    2. sstt 分别重复到该长度,比较是否相等。
    3. 若相等,则其为 LCM\operatorname{LCM};否则不存在。
    • 1

    信息

    ID
    6341
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者