神仙题。
我们可以在
0
0
0和
1
1
1之间画一条蓝线,
1
1
1和
0
0
0之间画一条红线,开头和结尾都有无限交替的红蓝线,那么两个串相等等价于它们对应的红蓝线相等。我们每次可以移动一条红线或蓝线,要求移动后仍满足串中间相邻的红蓝线距离为
1
1
1或
2
2
2。
那么我们就可以枚举两个串红蓝线之间的对应关系,对于一组对应关系,下界显然是对应的线之间的距离之和。我们断言下界是可以达到的,大概构造是考虑从左往右第一对不重合的线,如果
S
S
S串中的在
T
T
T串中的左侧,一直向右找第一对可以移动的即可,若在右侧,一直向右找到下一对是重合或左侧为止,然后向左找第一对可以移动的即可,这样每次都可以使一对线更接近。
时间复杂度
O
(
n
2
)
\mathcal O(n^2)
O(n2)。
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
char s1[5005],s2[5005];
int a[5005],b[5005];
int main() {
int n;
scanf("%d%s%s",&n,s1+1,s2+1);
int sz1=0,sz2=0;
for(int i=1;i<n;i++)
if (s1[i]!=s1[i+1]) a[++sz1]=i;
for(int i=1;i<n;i++)
if (s2[i]!=s2[i+1]) b[++sz2]=i;
int ans=inf;
for(int i=-sz1-1;i<=sz2+1;i++)
if ((i&1)^(s1[1]==s2[1])) {
int s=0;
for(int j=min(1,1-i);j<=max(sz1,sz2-i);j++)
s+=abs(((j<0)?0:((j>sz1)?n:a[j]))-((j+i<0)?0:((j+i>sz2)?n:b[j+i])));
ans=min(ans,s);
}
printf("%d\n",ans);
return 0;
}