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

浙公网安备 33010602011771号