Codeforces Round #685 (Div. 2) C
大意
给你长度都为 (N) 且只有小写字母的字符串 (a,b) ,和一个数字 (k)
你可以对 (a) 进行如下操作:
- 交换相邻两个字符的位置
- 将连续 (k) 个相同的字符变成下一个字符,无法从 (z) 变为 (a)
问:
是否可以让 (a) 在任意次数的变换后和 (b) 相等。
思路
首先,由操作一可以推出任意两个字符的位置都可以被调换。
那么无需考虑 (a,b) 中字符的相对位置,仅需考虑字符的数量关系。
从z到a考虑,(a,b) 中每个字母数量的差值都应该是 (k) 的倍数。
其次,因为 (a) 中字母只能从小往大升,所以说从大往小考虑过程中 (b) 的字母总数量一定时刻都要大于等于 (a) 的字母总数量。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)
const int mod = 998244353;
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;
int t, n, k;
string a, b;
int sum[27][2];
int main() {
cin >> t;
while(t--) {
memset(sum, 0, sizeof sum);
cin >> n >> k >> a >> b;
for(int i=0; i<n; i++)
++sum[a[i]-'a'+1][0], ++sum[b[i]-'a'+1][1];
int s=0;
bool flag=0;
for(int i=26; i && !flag; i--) {
if(abs(sum[i][1]-sum[i][0])%k) flag=1;
else s += sum[i][1]-sum[i][0];
if(s<0) flag=1;
}
if(!flag) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}