Lowest Common Ancestor 题解(lca+思维)

题目链接

题目大意

(t(tle 2 imes 10^6))组数据

给你一颗很大的完全二叉树

给你一个两个长度相同的字符串(s,t(lenle 10^3))

代表两个16进制,求出他们的(lca),也用16进制表示

题目思路

首先要明白如何求普通的两个数(x,y)(lca)

while(x!=y){
    if(x>y) x=x/2;
    else y=y/2;
}

其实就是除2获得答案

而这个是16进制,而且有1000位

你可以先把这两个数转为2进制,其实答案就是把两位数从最高位1往后比较一直比较到不相同

那么那一段即位答案,注意需要补前导0,然后把他转为16进制

代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
const int eps=1e-6;
char s[maxn],t[maxn];
string a,b;
map<char,string> mp;
int tot=0;
signed main(){
    mp['0']="0000";
    mp['1']="0001";
    mp['2']="0010";
    mp['3']="0011";
    mp['4']="0100";
    mp['5']="0101";
    mp['6']="0110";
    mp['7']="0111";
    mp['8']="1000";
    mp['9']="1001";
    mp['a']="1010";
    mp['b']="1011";
    mp['c']="1100";
    mp['d']="1101";
    mp['e']="1110";
    mp['f']="1111";
    int _;scanf("%d",&_);
    while(_--){
        a.clear(); b.clear();
        scanf("%s %s",s+1,t+1);
        int ds=strlen(s+1),dt=strlen(t+1);
        for(int i=1;i<=ds;i++){
            for(int j=0;j<mp[s[i]].size();j++){
                a.push_back(mp[s[i]][j]);
            }
        }
         for(int i=1;i<=dt;i++){
            for(int j=0;j<mp[t[i]].size();j++){
                b.push_back(mp[t[i]][j]);
            }
        }
        int pos1,pos2;
        int beg1,beg2;
        for(int i=0;i<a.size();i++){
            if(a[i]=='1'){
                pos1=i;
                break;
            }
        }
        for(int i=0;i<b.size();i++){
            if(b[i]=='1'){
                pos2=i;
                break;
            }
        }
        beg1=pos1,beg2=pos2;
        int pos=0;
        while(1){
            if(a[pos1]!=b[pos2]||pos1>a.size()||pos2>b.size()){
                break;
            }else{
                pos1++,pos2++;
            }
        }
        string temp=a.substr(beg1,pos1-1-beg1+1);
        while(temp.size()%4!=0){ //前导0
            temp="0"+temp;
        }
        printf("Case #%d: ",++tot);
        for(int i=0;i<temp.size();i+=4){
            int x=0;
            for(int j=i;j<=i+3;j++){
                x=x*2+(temp[j]-'0');
            }
            if(0<=x&&x<=9){
               cout<<x;
            }else{
                cout<<(char)(x-10+'a');
            }
        }
        cout<<"

";
    }
    return 0;
}
卷也卷不过,躺又躺不平
原文地址:https://www.cnblogs.com/hunxuewangzi/p/14541586.html