E. Long Inversions
题解
巧妙模拟题
1.\(n\leq 5000\) 所以可以暴力枚举k
2.把翻转的区间具象化,我们可以发现序列中值为 1 的地方覆盖了偶数个区间, 0 的地方覆盖率奇数个区间
所以我们遍历字符串的时候,在遇到的第一个0开始建立以其为左端点的区间,如果遇到 1 的区间覆盖数为奇数,那就再建立一层以其为左端点区间

code
#include<bits/stdc++.h>
using namespace std;
int n;
char s[5005];
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
cin>>(s+1);
for(int k=n;k>=1;k--)
{
int layer=0;
queue<int> q;
int flag=1;
for(int i=1;i<=n;i++)
{
if(s[i]-48==layer%2)
{
layer++;
q.push(i);
if(n-i+1<k)
{
flag=0;
break;
}
}
if(q.size()&&i-q.front()+1==k)
{
q.pop();
layer--;
}
}
if(flag)
{
cout<<k<<endl;
break;
}
}
}
return 0;
}

浙公网安备 33010602011771号