CF1965C Folding Strip 题解
结论:从左往右考虑,每遇到两个相邻且相同的字符就翻转一次。这样一定合法且最优。
首先考虑方案的合法性。因为只要有两个相邻且相同的字符就翻转一次,所以最终所有相同字符的位置的奇偶性一定是相同的,且一定形如 \(0101\dots\),所以一定合法。
接着考虑为什么一定最优。显然,两个相邻但不相同的字符一定不可能翻转,且翻转次数越多最终长度一定越小。所以每遇到两个相邻且相同的字符就翻转一次一定是最优的。
怎么计算答案?可以维护一个当前的方向,若翻转一次就转向,同时维护走到的最左端 \(l\) 和最右端 \(r\),那么 \(r-l+1\) 就是答案。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2e5 + 10;
int T,n;
char a[MAXN];
signed main() {
for(cin >> T;T;T--) {
cin >> n >> (a + 1);
int L = 1e18,R = -1e18,pos = 0;
int Fangxiang = 1;a[0] = 'a';
for(int i = 1;i <= n;i++) {
if(a[i] == a[i - 1]) Fangxiang *= -1;
else pos += Fangxiang;
L = min(L,pos),R = max(R,pos);
} cout << R - L + 1 << endl;
}
return 0;
}