1 条题解

  • 0
    @ 2025-10-27 21:46:17

    题目分析

    这是一个动态字符串处理问题,需要支持三种操作:

    • 查询:计算两个后缀的公共前缀长度 LCQ(x,y)\text{LCQ}(x,y)
    • 修改:将字符串中第 xx 个字符改为 dd
    • 插入:在第 xx 个字符后插入字符 dd

    暴力解法

    代码采用直接模拟的方法:

    查询操作

    while (x < (int)s.size() && y < (int)s.size() && s[x] == s[y])
        ++x, ++y, ++ans;
    
    • 时间复杂度:O(L)O(L),其中 LL 为公共前缀长度

    修改操作

    s[x - 1] = ch;
    
    • 时间复杂度:O(1)O(1)

    插入操作

    s.insert(x, 1, ch);
    
    • 时间复杂度:O(L)O(L),其中 LL 为字符串长度

    复杂度分析

    设字符串最终长度为 nn,查询次数为 qQq_Q,修改次数为 qRq_R,插入次数为 qIq_I

    • 总时间复杂度O(qQn+qIn)O(q_Q \cdot n + q_I \cdot n)
    • 最坏情况:$O(10000 \times 10^5 + 140000 \times 10^5) \approx 1.5 \times 10^{10}$

    适用数据范围

    该解法适用于:

    • 小数据:字符串长度不超过 10001000
    • 查询较少:如题目中前两个测试点

    对于大数据(n105n \leq 10^5M150000M \leq 150000),需要更高效的算法。


    优化方向

    哈希 + 二分

    • 预处理字符串哈希值
    • 查询时二分公共前缀长度
    • 时间复杂度:O(logn)O(\log n) 每次查询

    平衡树维护

    • 使用平衡树维护字符串
    • 每个节点存储子树哈希值
    • 支持 O(logn)O(\log n) 的修改、插入和查询

    样例验证

    输入

    madamimadam
    7
    Q 1 7    → 比较"madamimadam"和"mimadam" → 5
    Q 4 8    → 比较"amimadam"和"madam" → 1  
    Q 10 11  → 比较"am"和"m" → 0
    R 3 a    → s[2] = 'a'
    Q 1 7    → 比较"maamimadam"和"mimadam" → 2
    I 10 a   → 插入后字符串变化
    Q 2 11   → 比较"aamimadama"和"madama" → 1
    

    输出

    5
    1
    0
    2
    1
    

    与样例完全一致。


    总结

    该暴力解法实现简单,在数据规模较小时可行。对于大数据需要使用哈希或平衡树等数据结构进行优化。

    • 1

    信息

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