Codeforces Round #685 (Div. 2) C
阿新 • • 發佈:2020-11-22
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; }