题解:P10293 [CCC 2024 J4] Troublesome Keys
superballll · · 题解
题目分析
定义两个字符串,其中字符串
- 愚蠢的按键:按下的字母不会出现,但是会出现一个没有按下过的字母。即按下的字母在字符串
a 中出现了,但是在字符串b 中没有出现过。并且,显示的字母在字符串b 中出现了,但是在字符串a 中没有出现过。 - 安静的按键:按下的字母不会出现,而且也不会出现其他的字母。即在字符串
a 中出现了,但是在字符串b 中没有出现过。
那么,我们可以通过字母在两个字符串中出现次数的不同来找到突破口。
定义两个数组,其中
for(int i=0;i<lena;i++){
sa[a[i]-'a']++;
if(i<lenb) sb[b[i]-'a']++;
}
在刚才的分析中,我们会发现:如果某个字母在
再次对两个字符串进行枚举,当遇到
代码
#include<bits/stdc++.h>
using namespace std;
string a,b;
int lena,lenb;
int sa[30],sb[30];
char yc1='$',yc2,aj='-';
int main()
{
cin>>a>>b;
lena=a.length();
lenb=b.length();
for(int i=0;i<lena;i++)
{
sa[a[i]-'a']++;
if(i<lenb) sb[b[i]-'a']++;
}
for(int i=0;i<=25;i++)
{
if(sa[i]==0&&sb[i]!=0) yc2=(char)('a'+i); //a中未出现 b中出现了 一定是错误的那个
if(sa[i]!=0&&sb[i]==0) //不能确定是愚蠢的还是安静的
{
if(yc1=='$') yc1=(char)('a'+i);
else aj=(char)('a'+i);
}
}
if(lena!=lenb){ //按下过安静键
for(int i=0;i<lena;i++)
{
if(a[i]!=b[i])
{
if(b[i]==yc2&&a[i]==aj||b[i]!=yc2&&a[i]==yc1) //记录反了的情况
swap(yc1,aj);
break;
}
}
}
cout<<yc1<<" "<<yc2<<endl;
cout<<aj;
return 0;
}