C. String Equality
https://codeforces.com/problemset/problem/1451/C
题意:给定长度为n的字符串s跟t,以及一个数字k。每次操作可以交换s中任意两个相邻的字符,或者连续k个相同的字符c(c < 'z'),将c变为c + 1,问不限次数的操作之后,s能否变成t。
思路:可以无限次交换,说明可以任意排列,可以将连续的k个字母变成字母plus,说明这是一个统计的问题。统计出每个字符串中所有字符的数量,然后依次考虑a ~ z,如果哪个字符 <= t中字符出现的次数,那么就看该字符能否通过更小的字符来升级,从而使得该字符在s中出现的字符与t相等。 最后,判断升级后的两个统计数组是否相等即可。
总结:做的有点急了,把题目理解成连续的k个字符可以升级成其他的任意字符了。。。
inline void solve() {
int n, k;
cin >> n >> k;
string s, t;
cin >> s >> t;
vector<vector<int>> cnt(2, vector<int>(26, 0));
for (int i = 0; i < n; ++i) {
cnt[0][s[i] - 'a'] ++;
cnt[1][t[i] - 'a'] ++;
}
for (int i = 0; i < 26; ++i) {
if ((cnt[0][i] - cnt[1][i]) % k == 0 && cnt[0][i] < cnt[1][i]) {
for (int j = 0; j < i; ++j) {
int v = (cnt[1][i] - cnt[0][i]) / k;
v = min(v, (cnt[0][j] - cnt[1][j]) / k);
v = max(v, 0);
cnt[0][i] += v * k;
cnt[0][j] -= v * k;
}
}
}
cout << (cnt[0] == cnt[1] ? "yes" : "no") << '\n';
}

浙公网安备 33010602011771号