Logo zibenlun 的博客

博客

CF1907C

...
zibenlun
2025-12-01 12:58:16
分块好啊

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2023-12-11 21:07:24

Solution

这题乍一看感觉是括号匹配,但是细想其实是一个更加复杂的贪心。

例如这一组数据:

$abcdee$ 可以看到,当我们从左到右开始模拟的时候,发现最后剩下了 $ee$ 但是事实上,可以通过不按照原先的顺序从而消除所有的字符。

并且再通过观察,如果有一段连续的相同字符,那么它的两遍总是会有与它不同的字符,所以理论上是全部可以消除的。

但在常识上,如果在一个字符串中出现最多的字符出现次数占到了一半以上,那么肯定是消除不完的。

所以就有了以下代码:

Code

#include<bits\/stdc++.h>
using namespace std;
inline long long read() {
	long long s=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') {
		s=(s<<3)+(s<<1)+(ch^48);
		ch=getchar();
	}
	return s;
}
inline void write(long long x) {
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x\/10);
	putchar(x%10+'0');
}
int t,n,cnt[30],maxx;
char s[1000005];
int main(){
\/\/	freopen(".in","r",stdin);
\/\/	freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--){
		cin>>n>>(s+1);
		memset(cnt,0,sizeof cnt),maxx=0;
		for(int i=1;i<=n;i++){
			cnt[s[i]-'a']++;
			maxx=max(maxx,cnt[s[i]-'a']);
		}
		if(maxx>n\/2) cout<<maxx*2-n;
		else cout<<(n&1);
		cout<<"\n"; 
	}
	return 0;
}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。