acwing 笨拙的手指

题目

奶牛贝茜正在学习如何在不同进制之间转换数字。

但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔。

每当贝茜将数字转换为一个新的进制并写下结果时,她总是将其中的某一位数字写错。

例如,如果她将数字 14 转换为二进制数,那么正确的结果应为 1110,但她可能会写下 0110 或 1111。

贝茜不会额外添加或删除数字,但是可能会由于写错数字的原因,写下包含前导 0 的数字。

给定贝茜将数字 N 转换为二进制数字以及三进制数字的结果,请确定 N 的正确初始值(十进制表示)。

输入格式

第一行包含 N 的二进制表示,其中一位是错误的。

第二行包含 N 的三进制表示,其中一位是错误的。

输出格式

输出正确的 N 的值。

数据范围

0≤N≤10^9,且存在唯一解。

输入样例:

1010
212

输出样例:

14

样例解释

14 在二进制下的正确表示为 1110,在三进制下的正确表示为 112。

题解

分析

       因为数据量在10的9次方,还要再进行转换,比较的操作,这样枚举会严重超时
       所以将某一个进制的数枚举出所有可能的错误类型,然后进行转换,添加到哈希表中
       再对另一个进制进行转十进制的枚举,查看是否存在于一开始的哈希表中即可
        由于更换了枚举的对象,计算时间大幅减小,可以尝试使用数组来替换哈希表

代码

#include "iostream"
#include "unordered_set"
#include "string.h"
using namespace std;
int convert(const string& s,int x){
    int ans=0;
    for(auto c:s){
        ans=ans*x+c-'0';
    }
    return ans;
}
int main(){
     unordered_set<int>bin;
     string a,b;
     cin>>a>>b;
     for(auto &x:a){
        x=x=='1'?'0':'1';
        bin.insert(convert(a,2));
        x=x=='1'?'0':'1';
     }
     for(auto &x:b){
         char t=x;
         for(int i=0;i<3;i++) {
             if(i+'0'!=t){
                 x=char(i+'0');
                 int ans= convert(b,3);
                 if(bin.count(ans)){
                 cout<<ans;
                 return 0;
                }
            }
         }
         x=t;
     }
}

posted @ 2023-02-22 00:58  Cheng_Mao  阅读(16)  评论(0编辑  收藏  举报