「须知少时|

BadBadBad__AK

园龄:1年6个月粉丝:13关注:6

P10293 [CCC 2024 J4] Troublesome Keys 题解

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

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

主要方法:首先如果是正常的键,那么在 s1s2 所统计的个数应该是相同的,如果是愚蠢的键,那么愚蠢的键对应的字母(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;
}

本文作者:BadBadBad__AK

本文链接:https://www.cnblogs.com/BadBadBad/p/18113119/P10293

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   BadBadBad__AK  阅读(56)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起