题目链接:
​​​点击打开题目​

题意:
看了2遍,居然还不知所云…再看几遍才知道说啥….英文阅读能力有点退化了呀…

其实就是进制转换。
拿第三个样例来说,
因为source_language是16位,所以是个16进制。(十进制)13转换成16进制就是19。
"13"(alien_source)=1∗161+3∗160=16+3=19(16进制)。
19再转换成“01”(二进制)就是1∗24+1∗21+1∗20−>10011。
然后直接模拟就可以啦。

代码:

/*
* this code is made by LzyRapx
* Problem: 1038
* Verdict: Accepted
* Submission Date: 2017-06-06 14:23:15
* Time: 4MS
* Memory: 5592KB
*/
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e6+10;
char s[MAXN], source[MAXN], target[MAXN], ans[MAXN];
map<char, int> mps;
map<int, char> mpt;
long long q_pow(int n,int k)
{
long long ans=1;
while(k)
{
if(k&1) ans=ans*n;
k>>=1;
n=n*n;
}
return ans;
}
int main()
{
int t, cas= 1;
cin>>t;
getchar();
while(t--)
{
mps.clear();
mpt.clear();
scanf("%s", s);
scanf("%s", source);
scanf("%s", target);
int len1 = strlen(s);
int len2 = strlen(source);
int len3 = strlen(target);

for(int i=0; i<len2; i++)
{
mps[source[i]] = i;
}
for(int i=0; i<len3; i++)
{
mpt[i] = target[i];
}
int res = 0;
for(int i=0; i<len1; i++)
{
res += q_pow(len2,i)*mps[s[len1-i-1]];
// cout<<"res="<<res<<endl;

}
// cout<<"res="<<res<<endl;
if(res==0)
{
printf("Case #%d: ", cas++);
printf("%c\n", target[0]);
continue;
}
int cnt = 0;
while(res)
{
ans[cnt++] = mpt[(res%len3)];
res /= len3;
}

printf("Case #%d: ", cas++);
for(int i=cnt-1; i>=0; i--) cout<<ans[i];
cout<<endl;
}
return 0;
}