• 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;
    }
    
    卷也卷不过,躺又躺不平
  • 相关阅读:
    新的页面事件的添加
    excel里数字0不显示
    VB6接口、对象比较等
    SQL SERVER服务停止和启动命令行
    如何更改VS2008的字体和大小
    如何部署windows service
    模式应用 - 利用工厂模式制作自己的"小程序测试工厂"
    解决Oracle Temp01.dbf不断变大的问题
    如何配置VS2008让它用外置IIS进行调试
    使用JQuery Autocomplete插件(一)
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/14541586.html
Copyright © 2020-2023  润新知