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';
}
posted @ 2025-04-29 09:22  _Yxc  阅读(22)  评论(0)    收藏  举报