题面
Define a block in a string as a contiguous substring of characters of the same type that cannot be extended either to the left or the right. For example, in the string aabcccdaa, there are five blocks:
- aa (-st to -nd characters)
- b (-rd character)
- ccc (-th to -th characters)
- d (-th character)
- aa (-th to -th characters).
You are playing a game where you are given a string of length . You can cyclically rotate the string however you want. Your score is then calculated as the number of blocks in the final string. Please find the maximum score possible.
Formally, choose an index , and replace the string with the string . For example, the string abcde can be rotated to string deabc by choosing .
Input
Each test contains multiple test cases. The first line contains the number of test cases (). The description of the test cases follows.
The first line of each test case contains a single integer ().
The second line of each test case contains the string of length .
Strings consist of lowercase Latin characters only.
Output
For each testcase, output a single integer denoting the maximum score you can achieve.
思路
这题所描述的本质上是一个环,且题目要求旋转之后的块数要尽可能最大化,因此我们可以把问题转化成:“环上相邻字符是否不同”
我们可以设一个变量 来表示环上的相邻字符不同的个数(换言之,不同边的个数)
而对于题目中的循环操作,本质是将这个环切开,得到一个线性的链
之后,就可以计算出块数:
NOTE为什么要+1 ?
最终的答案是“块的最大值”,而如果不+1,最终计算的只是基于第一个块之后的新块的数量 因此,我们加上这个1,才能体现总的块数量
e.g. 对于 aaaaa,如果执行旋转之后,不+1,最终会得到块的数量为0,这很明显是错误的
当然,也要注意特殊情况:当所有相邻字符都不同,此时,有
代码
#include <bits/stdc++.h>
using namespace std;
int main() { int t; cin >> t; while (t--) { int n; string s; cin >> n >> s;
int D = 0; for (int i = 0; i < n; i ++) { if (s[i] != s[(i + 1) % n]) { D ++; } }
int ans = (D == n ? n : D + 1); cout << ans << endl; } return 0;}