开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 20 天,点击查看活动详情
分析
今天这题比较暴力感觉就是,不用手写哈希感觉真棒,我的代码比较丑,希望大家别介意,我写了130多行,不懂我在干嘛,基本思路就是这样,就是说不是说二进制和三进制数都各有一位错了吗,那么我们就暴力枚举呗,先处理二进制,因为二进制简单,就把二进制每一位都变成相反的数,那么我们就发现,最多有32种情况,我们把这32种情况存一下,然后我们处理三进制,三进制就稍微多一点,三进制目测大概有20位左右,每一位2种情况,最后一共不超过40种情况,但是三进制要分6种情况讨论,所以代码长一点,中间也有些细节要实现!
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
#include <cmath>
#include <unordered_map>
#include <stack>
#include <queue>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int,ll> PII;
typedef pair<string,int> PSI;
typedef stack<int> stk;
ll gcd(ll x,ll y){
return y?gcd(y,x%y):x;
}
ll qmi(ll x,ll y){
ll res=1;
while(y){if(y&1) res=res*x;y>>=1;x=x*x;}
return res;
}
char a[42],b[42];
map<int,int>mp2,mp3;
int n2,n3;
int sum=0;
int sun2(int id){
int res=0;
char c=a[id];
if(a[id]=='1') a[id]='0';
else a[id]='1';
for(int i=1;i<=n2;i++){
res+=(a[i]-'0')*qmi(2,n2-i);
}
a[id]=c;
return res;
}
bool check(int id){
char c=b[id];
if(b[id]=='0'){
b[id]='1';
int res=0;
for(int i=1;i<=n3;i++){
res+=(b[i]-'0')*qmi(3,n3-i);
}
if(mp2.count(res)){
sum=res;
return true;
}
res=0;
b[id]='2';
for(int i=1;i<=n3;i++){
res+=(b[i]-'0')*qmi(3,n3-i);
}
if(mp2.count(res)){
sum=res;
return true;
}
}
b[id]=c;
if(b[id]=='1'){
b[id]='0';
int res=0;
for(int i=1;i<=n3;i++){
res+=(b[i]-'0')*qmi(3,n3-i);
}
if(mp2.count(res)){
sum=res;
return true;
}
res=0;
b[id]='2';
for(int i=1;i<=n3;i++){
res+=(b[i]-'0')*qmi(3,n3-i);
}
if(mp2.count(res)){
sum=res;
return true;
}
}
b[id]=c;
if(b[id]=='2'){
b[id]='1';
int res=0;
for(int i=1;i<=n3;i++){
res+=(b[i]-'0')*qmi(3,n3-i);
}
if(mp2.count(res)){
sum=res;
return true;
}
res=0;
b[id]='0';
for(int i=1;i<=n3;i++){
res+=(b[i]-'0')*qmi(3,n3-i);
}
if(mp2.count(res)){
sum=res;
return true;
}
}
b[id]=c;
return false;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
mp2.clear(),mp3.clear();
scanf("%s%s",a+1,b+1);
n2=strlen(a+1),n3=strlen(b+1);
for(int i=1;i<=n2;i++){
mp2[sun2(i)]++;
}
for(int i=1;i<=n3;i++){
if(check(i)){
cout<<sum<<"\n";
break;
}
}
return 0;
}
希望能帮助到大家QAQ~!