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';
}