蓝桥杯每日一题第八天

91 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 20 天,点击查看活动详情

841. 字符串哈希

分析

今天这题比较暴力感觉就是,不用手写哈希感觉真棒,我的代码比较丑,希望大家别介意,我写了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~!