Title

CF1913B Swap and Delete 题解

解题思路

我们将题意转化一下:

  • 求 $s$ 的反转后的字符串的一个最长前缀,使其满足可以通过 $s$ 得到。

显然,交换不会改变每种字符的数量。那么,我们先把 $s$ 求出其中 $0$ 的数量 $s0$,和 $1$ 的数量 $s1$,然后将 $s$ 每位反转($0$ 变 $1$),然后从第一位开始,记录此时的 $0$ 的数量 $t0$ 和 $1$ 的数量 $t1$,如果这个时候有 $t0=s0 \wedge t1=s1$,那么直接输出 $n-i$ 即可;如果 $t0>s0\vee t1>s1$,那么输出 $n-i+1$。

AC 代码

#include<math.h>
#include<time.h>
#include<stdio.h>
#include<algorithm>
#define ll long long
#include<cstring>
#define N 200005
char s[N];
inline void work(){
    scanf("%s",s+1);
    int n=strlen(s+1);
    int s0=0,s1=0;
    for(register int i=1;i<=n;++i){
        if(s[i]=='0') ++s0;
        else ++s1;
    }int t1=0,t0=0;
    for(register int i=1;i<=n;++i){
        if(s[i]=='0') ++t1;
        else ++t0;
        if(t1==s1&&t0==s0){
            printf("%d\n",n-i);
            return;
        }else if(t1>s1||t0>s0){
            printf("%d\n",n-i+1);
            return;
        }
    }
}signed main(){
    srand(114514);
    srand(rand());
    srand(time(0));
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    int T;scanf("%d",&T);
    while(T--) work();
    return 0;
}
posted @ 2023-12-22 10:33  UncleSam_Died  阅读(23)  评论(0)    收藏  举报  来源