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;
}
posted @ 2024-05-05 20:50  Creeper_l  阅读(13)  评论(0编辑  收藏  举报