CF1800E1 题解

洛谷传送门 & CF 传送门

思路

我们做以下步骤即可将 aia_iai1a_{i-1} 交换:

  1. 交换 aia_iai+ka_{i+k}
  2. 交换 ai+ka_{i+k}ai1a_{i-1}
  3. 交换 aia_iai+ka_{i+k}

我们可以交换相邻两个数,这说明只要 iijj 都是能交换的,那 ii 位置上的字符一定能到达 jj!而 ii 位置能交换的标准就是 i<ki<ki>=nki>=n-k。另外,我们还要判断一下两个字符串是否拥有同一堆字符。

代码

# include <bits/stdc++.h> //万能头 
using namespace std;
int t, n, k, sa[150], sb[150], x;
string a, b;
bool f () {
	cin >> n >> k >> a >> b;
	//从这里开始判重……这是一种记录字母数量方法,还有一种用排序判重的方法可以看 yyz1005 的题解
	memset (sa, 0, sizeof sa); //多组数据要清空!
	memset (sb, 0, sizeof sb);
	for (int i = 0; i < n; ++ i)
		++ sa[a[i]]; //记录 a 的字母
	for (int i = 0; i < n; ++ i)
		++ sb[b[i]]; //记录 b 的字母
	for (char i = 'a'; i <= 'z'; ++ i)
		if (sa[i] != sb[i]) //数量不相同
			return 0;
	//到这里结束判重……
	for (int i = 0; i < n; ++ i)
		if (a[i] != b[i] && i < k && i >= n - k) //判断字符是否相同和能不能交换
			return 0;
	return 1;
}
int main () {
	cin >> t;
	while (t --)
		cout << (f () ? "YES\n" : "NO\n");
	return 0;
}
posted @ 2023-08-04 14:01  Vitamin_B  阅读(11)  评论(0)    收藏  举报  来源