题解:CF1955E Long Inversions

简单题。

考虑贪心地进行修改,每次选择字符串中最左侧第一个 00,并以该位置为左端点进行一次修改,可以发现若 lenlen 合法则这样一定构造出全 11 串。

然而直接暴力实现是 O(n2)O(n^2) 的,但是发现每次选择的 00 的位置一定是递增的,且一个位置在若干次修改后是否为 00 仅与其初始值与该位置被修改次数(即被区间覆盖次数)有关,于是考虑在顺序枚举位置并进行区间修改时,差分维护每个位置被修改次数即可判断某个位置是否需要被修改。

单次检查时间复杂度变为 O(n)O(n) 级别,总时间复杂度 O(n2)O(n^2) 级别。

AC code

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e4+5;
int n,d[maxn];
string s;
bool check(int len){
	memset(d,0,sizeof(d));
	for(int i=0;i<n;i++){
		d[i]=d[i]+d[i-1];
		int tmp=s[i]-'0';
		if(d[i]%2==1){
			tmp^=1;
		}
		if(tmp==0){
			if(i<=n-len){
				d[i]++;
				d[i+len]--;
			}
			else{
				return 0;
			}
		}
	}
	return 1;
}
signed main(){
	int t;
	cin>>t;
	while(t--){
		cin>>n>>s;
		for(int i=n;i>=1;i--){
			if(check(i)){
				cout<<i<<endl;
				break;
			}
		}
	}
	return 0;
}
posted @   KK_SpongeBob  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示