C. Dominant Character

https://codeforces.com/contest/1605/problem/C

题意:给定一个长度为n的字符串s,s只包含字符abc,现问满足条件的字符串的最短长度是多少?要求长度至少为2。条件:a出现的次数严格大于b和c各出现的次数。

思路:考虑各种情况,假如有aa,那么答案就是2;有aba或者aca,答案就是3。有abca或acba,答案就是4。否则,无解?No,还有一种很恶心的,abbacca,答案为7。所以直接暴力破解,考虑长度不超过10的字符串,看是否有符合条件的即可。为什么大于7的字符串一定不是最优解?有点抽象,这跟a的出现方式有关,如果a中间出现了b跟c,而还要使用这个a,那么这个a一定对最终的答案是有贡献的,如果贡献太低,就不需要使用它。比如abbbaccabba,第一个a出现了一次,但是后面接了3个b,则这个a不考虑了,只考虑后面的a即可,此时c出现的次数为2。 所以说,如果a不是连续的,并且两个a中间出现了其他的字符,那么其他字符出现的次数不能超过3次,否则,使用前面的a将没有意义,毕竟a才出现了两次,中间夹了3个?不合理,所以a如果不连续,那么中间其他字符出现的次数最多为2次。

总结:一开始看错题了,看成了求长度最长的子串,写完发现让求最短的。理解题意后,考虑到了长度从2~3的字符串样式,但是忽略了4的,后面又发现长度还有7的字符串。。很搞的题!! 再补充一下,s.find_first_of真的很坑,不建议使用,不如用s.find(t, pos)。

/* this solution is for the longest substring...motherfucker
inline void solve(){
    int n;
    cin >> n;

    string s;
    cin >> s;

    set<pair<int, int>> sett;
    array<int, 3> cnt = {};
    int ans = -1;
    for (int i = 0; i < n; ++i) {
        cnt[s[i] - 'a'] ++;
        int cur = cnt[0] - max(cnt[1], cnt[2]);
        auto it = sett.lower_bound({-cur, 0});
        if (it != sett.end()) {
            ans = max(ans, i - it->second + 1);
        }
        sett.insert({cur, i});
    }

    cout << ans << '\n';
}*/

inline void solve() {
    int n;
    cin >> n;

    string s;
    cin >> s;

    auto valid = [](string& ss) {
        if (ss.size() < 2) {
            return false;
        }
        array<int, 3> v = {};
        for (auto& c : ss) {
            v[c - 'a'] ++;
        }
        return (v[0] - max(v[1], v[2])) > 0;
    };

    int ans = INF;
    for (int i = 0; i < n - 1; ++i) {
        for (int j = 1; j < 10; ++j) {
            auto ss = s.substr(i, j);
            if (valid(ss)) {
                ans = min(ans, j);
            }
        }
    }

    if (ans == INF) {
        ans = -1;
    }

    cout << ans << '\n';
}
posted @ 2025-03-17 11:06  _Yxc  阅读(11)  评论(0)    收藏  举报