Dominant Character—CF1605C
思路
- 若字符串中存在相邻的
a
字符,即存在aa
子串。输出 2 2 2。 - 若字符串中不存在相邻的
a
字符。那么满足条件的子串的格式一定是a + xx + a + ... + a + xx + a
,其中xx
代表由b
和c
组成的字符串。那么显然可以对a
的数量分类讨论。注意两个相邻的a
直接的字符个数只能是 2 2 2,否则一定会出现b
或c
的个数大于等于a
的个数的情况。- 如果
a
数量为 2 2 2,所有可能的情况为:aba
、aca
、abca
、acba
。可以通过暴力在 s s s 字符串中找出。 - 如果
a
数量为 3 3 3,所有可能的情况为:abbacca
、accabba
(这里已经排除了能被分类到 2.1 中的情况例如abbacca
)。同样可以通过暴力找出。 - 如果
a
数量大于等于 4 4 4。排除能分类到 2.1 的情况,所以字符串中的xx
不能是bc
和cb
;排除能分类到 2.2 的情况,所以字符串中不能出现abbacca
和accabba
子串,所以一个字符串中的所有xx
只能全是bb
或全是cc
,而这样的字符串一定是不满足 “a
的个数大于b
的个数和c
的个数”,所以不存在满足 2.3 情况的字符串。
- 如果
综上,满足条件的子串有:aa
,aba
、aca
、abca
、acba
、abbacca
、accabba
。
C o d e Code Code
#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 2e5 + 10;int n;void solve() {cin >> n;string s; cin >> s;s = " " + s;cout << " ";// aafor (int l = 1; l + 1 <= n; l ++) {if (s[l] == 'a' and s[l + 1] == 'a') {cout << "2\n";return;}}// aca acafor (int l = 1; l + 2 <= n; l ++) {if (s[l] == 'a' && s[l + 2] == 'a') {cout << "3\n";return;}}// abca acbafor (int l = 1; l + 3 <= n; l ++) {string ss = s.substr(l, 4);if (ss == "abca" || ss == "acba") {cout << "4\n";return;}}// abbacca accabbafor (int l = 1; l + 6 <= n; l ++) {string ss = s.substr(l, 7);if (ss == "abbacca" || ss == "accabba") {cout << "7\n";return;}}cout << "-1\n";
}signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int T = 1;cin >> T; cin.get();while (T --) solve();return 0;
}