CF1800E1 题解
思路
我们做以下步骤即可将 和 交换:
- 交换 和 。
- 交换 和 。
- 交换 和 。
我们可以交换相邻两个数,这说明只要 和 都是能交换的,那 位置上的字符一定能到达 !而 位置能交换的标准就是 且 。另外,我们还要判断一下两个字符串是否拥有同一堆字符。
代码
# 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;
}

浙公网安备 33010602011771号