2022.7.13 AGC032E&AGC030E&AGC057D

AGC030E Less than 3

题意:给定等长 \(01\) 序列 \(S,T\),满足不存在连续三个数相同,每次可以 flip \(S\) 的一位,维持这个性质,求 \(S\to T\) 的最小步数。

题解:考虑在 \(01\) 之间画红线,\(10\) 之间画蓝线,枚举上下移位匹配即可。代码中扩大范围是因为有可能奇偶性够不到。

#include<bits/stdc++.h>
using namespace std;
#define inf 1e9
const int maxn=2e5+10;
const int mod=1e9+7;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
	return x*f;
}
const int N=5e3+10;
int n,m,a[N],b[N],t1,t2,ans=inf;
char S[N],T[N];
int main(){
	n=read();scanf("%s%s",S+1,T+1);
	for(int i=1;i<n;i++)if(S[i]!=S[i+1])a[++t1]=i;
	for(int i=1;i<n;i++)if(T[i]!=T[i+1])b[++t2]=i;
	for(int i=-t1-1;i<=t2+1;i++)if((i&1)^(S[1]==T[1])){
		int Sum=0;
		for(int j=min(1,1-i);j<=max(t1,t2-i);j++)
			Sum+=abs((j<=0?0:(j>t1?n:a[j]))-(i+j<=0?0:(i+j>t2?n:b[i+j])));
		ans=min(ans,Sum);
	}printf("%d\n",ans);
	return 0;
}
posted @ 2022-07-13 00:14  syzf2222  阅读(155)  评论(0编辑  收藏  举报