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;
}

posted @ 2024-04-09 16:41  纯粹的  阅读(181)  评论(0)    收藏  举报