Codeforces 1215 C. Swap Letters(贪心)

在这里插入图片描述

题意:

给你两个字符串,问最少需要交换多少次可以使这两个字符串相等,并且输出交换方案。

因为字符只有a,b两种;所以不相等的时候只有两种情况
a b a\\b

b a b\\a

首先每次交换当然要尽量一次交换就多两个相同的位置。
优先把
a b a\\b

a b a\\b
交换

优先把
b a b\\a

b a b\\a
交换

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;
}
发布了786 篇原创文章 · 获赞 460 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/qq_43627087/article/details/105208767