1 条题解

  • 0
    @ 2025-12-16 17:51:30

    知识点:贪心、思维、构造

    延续题干定义,记选中的子串为 a=s[i..j]a=s[i..j],那么 bb 的最优构造方案为以下两个中的其中一个:

    • 第一段仅包含一个字符,即 aa 的第一个字母,需要去位置 ii 前寻找;第二段包含 aa 的剩余部分,可以共用这部分;

    • 第二段仅包含一个字符,即 aa 的最后一个字母,需要去位置 jj 后寻找;第一段包含 aa 的剩余部分,可以共用这部分;

    这样的选择方式最大程度的重复利用了字符,为最佳贪心策略。所以,我们只需要判定是否存在相同的字符,如果是,则更新答案。具体到代码层面上,对于每一种字符,找到其出现的全部位置,依次枚举检查更新答案。虽然依旧存在非常多优化,但是这样朴素的贪心策略已经可以通过本题,且没有复杂度上的本质差异,所以这里不再赘述其他做法。

    需要注意的是,由于不允许选取空串,所以答案不存在11的情况。

    #include <bits/stdc++.h>
    using namespace std;
    
    signed main() {
        int n;
        string s;
        cin >> n >> s;
        s = "#" + s;
        
        int ans = 0;
        for (int ch = 0; ch < 26; ch++) {
            int pre = 0, net = 0;
            for (int i = 1; i <= n; i++) {
                if (s[i] - 'a' != ch) continue;
                if (pre != 0) {
                    ans = max(ans, n - i + 1);
                }
                pre = i;
            }
            for (int i = n; i >= 1; i--) {
                if (s[i] - 'a' != ch) continue;
                if (net != 0) {
                    ans = max(ans, i);
                }
                net = i;
            }
        }
        cout << (ans == 1 ? 0 : ans) << "\n";
    }
    
    
    • 1

    信息

    ID
    164
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    31
    已通过
    7
    上传者