题目链接
E. Long Inversions-Codeforces Round 938 (Div. 3)
题意
题意为,可以选择一个数k,每次操作可以让长度为k的部分翻转,不论操作次数,问k的最大值。
分析
n<5000,则可以枚举所有长度。
对于每种长度len,需要对区间进行操作,如果暴力时间复杂度太高,所以可以使用差分数组来实现。
代码
#include<iostream>
using namespace std;
void solve(){
int n;cin>>n;
string s;cin>>s;
s='0'+s;
int f=0;
for(int len=n;len>=1;len--){//枚举所有长度
f=len;
int p[n+2]={0};
int now=0;
for(int i=1;i<=n-len+1;i++){
now+=p[i];
if((now+s[i]-'0')%2==0){
now++;
p[i+len]++;
}
}
for(int i=n-len+2;i<=n;i++){
now+=p[i];
if((now+s[i]-'0')%2==0) {f=0;break;}
}
if(f) break;
}
cout<<f<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;cin>>T;
while(T--) solve();
}