题目链接
题目大意
(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;
}