题意:
给你两个字符串,问最少需要交换多少次可以使这两个字符串相等,并且输出交换方案。
因为字符只有a,b两种;所以不相等的时候只有两种情况
首先每次交换当然要尽量一次交换就多两个相同的位置。
优先把
和
交换
优先把
和
交换
AC代码:
const int N = 200010;
int pos1[N], pos2[N];
string s1, s2;
int n;
int main()
{
sd(n);
cin >> s1;
cin >> s2;
int k1 = 0, k2 = 0;
rep(i, 0, n - 1)
{
if (s1[i] != s2[i] && s1[i] == 'a')
pos1[k1++] = i + 1;
if (s1[i] != s2[i] && s1[i] == 'b')
pos2[k2++] = i + 1;
}
if ((k1 + k2) % 2 == 1)
puts("-1");
else
{
int i, j;
int cnt = k1 / 2 + k2 / 2;
if (k1 % 2 == 1 && k2 % 2 == 1)
cnt = cnt + 2;
pd(cnt);
for (i = 0; i + 1 < k1; i = i + 2)
pdd(pos1[i], pos1[i + 1]);
for (j = 0; j + 1 < k2; j = j + 2)
pdd(pos2[j], pos2[j + 1]);
if (i != k1 && j != k2)
{
pdd(pos1[k1 - 1], pos1[k1 - 1]);
pdd(pos1[k1 - 1], pos2[k2 - 1]);
}
}
return 0;
}