P10293 [CCC 2024 J4] Troublesome Keys 题解

可能我的方法代码量有点大,但是思路绝对是很好懂的。

主要就分两种情况,第一种是从前往后,第二种是从后往前。

主要方法:首先如果是正常的键,那么在 \(s1\)\(s2\) 所统计的个数应该是相同的,如果是愚蠢的键,那么愚蠢的键对应的字母(\(a1\))就会在 \(s1\) 中比在 \(s2\) 中多,而它显示错误的字母(\(a2\))就会比 \(s2\) 少,基于此,我们就可以快速的找到 \(a2\),并且知道按下了多少个愚蠢的键,如果是静音键,那么静音键对应的字母也是要在 \(s1\) 中比在 \(s2\) 中多,基于此,我们也可以找到静音键。

代码

#include<bits/stdc++.h>
using namespace std;
char s1, s2, q1 = '-';
int qa[150], qb[150], k;
int main() {
	string a, b;
	cin >> a >> b;
	for (int i = 0; i < a.length(); i++) {//预处理 
		qa[a[i]]++;
	}
	for (int i = 0; i < b.length(); i++) {//同上 
		qb[b[i]]++;
	}
	for (int i = 90; i < 150; i++) {
		if (qb[i] > qa[i]) {
			s2 = (char)i;
			k = qb[i] - qa[i];
			break;
		}
	}
	//情况1(从前往后)
	for (int i = 90; i < 150; i++) {
		if (qa[i] - qb[i] == k && qb[i] == 0) {
			s1 = (char)i;
			break;
		}
	}
	for (int i = 90; i < 150; i++) {
		if (qa[i] > qb[i] && qb[i] == 0 && i != s1) {
			q1 = (char)i;
			break;
		}
	}
	string t;
	for (int i = 0; i < a.length(); i++) {
		if (a[i] == s1)t += s2;
		else if (a[i] == q1)continue;
		else t += a[i];
	}
	if (t == b) {
		cout << s1 << " " << s2 << endl;
		cout << q1;
		return 0;
	}
	//情况2(从后往前)
	for (int i = 149; i > 90; i--) {
		if (qa[i] - qb[i] == k && qb[i] == 0) {
			s1 = (char)i;
			break;
		}
	}
	for (int i = 149; i > 90; i--) {
		if (qa[i] > qb[i] && qb[i] == 0 && i != s1) {
			q1 = (char)i;
			break;
		}
	}
	string q;
	for (int i = 0; i < a.length(); i++) {
		if (a[i] == s1)q += s2;
		else if (a[i] == q1)continue;
		else q += a[i];
	}
	if (q == b) {
		cout << s1 << " " << s2 << endl;
		cout << q1;
		return 0;
	}
	return 0;
}
posted @ 2024-04-03 17:09  BadBadBad__AK  阅读(43)  评论(0编辑  收藏  举报