题解:P16815 [蓝桥杯 2026 国 Python B] 糖果转盘
Ethan_sun
·
·
题解
solution
三个样例分别是三种可能的答案。
下文中我们将 cnt 记作字符串 s 中满足 s_i = s_{i + 1} 且 1 \le i < n 或 s_{n - 1} = s_0 的数量。
开始分讨。
::::info[当 cnt = 0 时]{open}
此时显然所有 n 个切口切下后展开的糖果不会出现有两颗相邻的是颜色相同的。
所以此时答案是 n。
::::
::::info[当 cnt = 1 时]{open}
我们假设 s_i = s_{i + 1}。那么除了从第 i 和第 i + 1 颗糖果之间切下,其余切法都会使得 s_i = s_{i + 1}。
所以此时答案是 1。
::::
::::info[剩下情况]{open}
首先有 cnt \ge 2。
我们先假设 s_i = s_{i + 1} 且 s_{j} = s_{j + 1} ,这里 i \ne j。
如果从第 i 和第 i + 1 颗糖果之间切下,那么一定还有 s_j = s_{j + 1},所以不是漂亮切口。从第 j 和第 j + 1 颗糖果之间切下同理。
所以此时答案是 $0$。
::::
### code
:::success[展开]
```cpp
#include <bits/stdc++.h>
#define debug(a) cerr << (#a) << " = " << (a) << endl;
#define int long long
#define maxn 100010
#define endl '\n'
using namespace std;
int n;
string s;
void solve() {
cin >> n >> s;
int cnt = 0;
for (int i = 0; i < n - 1; i++) cnt += (s[i] == s[i + 1]);
cnt += (s[n - 1] == s[0]);
if (!cnt) cout << n << endl;
else if (cnt == 1) cout << cnt << endl;
else cout << 0 << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t; t = 1;
// cin >> t;
while (t--) solve();
return 0;
}
```
::::