ACdream 1038 Alien Numbers (模拟)

布满荆棘的人生 2022-06-14 01:22 265阅读 0赞

题目链接:
点击打开题目

题意:
看了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。
然后直接模拟就可以啦。

代码:

  1. /*
  2. * this code is made by LzyRapx
  3. * Problem: 1038
  4. * Verdict: Accepted
  5. * Submission Date: 2017-06-06 14:23:15
  6. * Time: 4MS
  7. * Memory: 5592KB
  8. */
  9. #include <bits/stdc++.h>
  10. using namespace std;
  11. const int MAXN = 1e6+10;
  12. char s[MAXN], source[MAXN], target[MAXN], ans[MAXN];
  13. map<char, int> mps;
  14. map<int, char> mpt;
  15. long long q_pow(int n,int k)
  16. {
  17. long long ans=1;
  18. while(k)
  19. {
  20. if(k&1) ans=ans*n;
  21. k>>=1;
  22. n=n*n;
  23. }
  24. return ans;
  25. }
  26. int main()
  27. {
  28. int t, cas= 1;
  29. cin>>t;
  30. getchar();
  31. while(t--)
  32. {
  33. mps.clear();
  34. mpt.clear();
  35. scanf("%s", s);
  36. scanf("%s", source);
  37. scanf("%s", target);
  38. int len1 = strlen(s);
  39. int len2 = strlen(source);
  40. int len3 = strlen(target);
  41. for(int i=0; i<len2; i++)
  42. {
  43. mps[source[i]] = i;
  44. }
  45. for(int i=0; i<len3; i++)
  46. {
  47. mpt[i] = target[i];
  48. }
  49. int res = 0;
  50. for(int i=0; i<len1; i++)
  51. {
  52. res += q_pow(len2,i)*mps[s[len1-i-1]];
  53. // cout<<"res="<<res<<endl;
  54. }
  55. // cout<<"res="<<res<<endl;
  56. if(res==0)
  57. {
  58. printf("Case #%d: ", cas++);
  59. printf("%c\n", target[0]);
  60. continue;
  61. }
  62. int cnt = 0;
  63. while(res)
  64. {
  65. ans[cnt++] = mpt[(res%len3)];
  66. res /= len3;
  67. }
  68. printf("Case #%d: ", cas++);
  69. for(int i=cnt-1; i>=0; i--) cout<<ans[i];
  70. cout<<endl;
  71. }
  72. return 0;
  73. }

发表评论

表情:
评论列表 (有 0 条评论,265人围观)

还没有评论,来说两句吧...

相关阅读