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