题解:P10841 【MX-J2-T2】Turtle and Strings
block_in_mc · · 题解
题目大意
给定字符串
解题思路
考虑贪心,尽量分为长度为
- 若
s_i\not=l ,则选择s_i 作为新的字符串; - 否则,选择
s_i 至s_{i+1} 作为新的字符串。
显然,若
但是考虑字符串 aaaaabaa,切分为 a/aa/a/ab/a/?,这里剩下来的一个字符不能单独分,需要和前面的 a 合并。
再考虑字符串 aaaaaaaa,切分为 a/aa/a/aa/a/?,这里剩下来的 a 与前一个合并后为 aa,与前面重复,这里还可以将 aa 再与 aa 合并,变为 a/aa/a/aaaa。
但是这样是错误的。不难发现,a/aa/a/aaaa 可以再分为 a/aa/a/aaa/a,而类似的都可以这样做。综合考虑两种情况,发现最终答案就是考虑最后一个字符前的答案。
AC 代码
#include <bits/stdc++.h>
using namespace std;
int t, n;
string s;
int main() {
cin >> t;
while (t--) {
cin >> n >> s;
s = " " + s;
string last;
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (s.substr(i, 1) != last) last = s.substr(i, 1), cnt++;
else if (i < n) last = s.substr(i, 2), cnt++, i++;
else i++;
}
printf("%d\n", cnt);
}
return 0;
}