1. 程式人生 > 實用技巧 >Codeforces Round #685 (Div. 2) C

Codeforces Round #685 (Div. 2) C

Codeforces Round #685 (Div. 2) C

大意

給你長度都為 \(N\) 且只有小寫字母的字串 \(a,b\) ,和一個數字 \(k\)

你可以對 \(a\) 進行如下操作:

  1. 交換相鄰兩個字元的位置
  2. 將連續 \(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;
}