赛氪2020上半年 A.转换AV号(avtobv)[神奇的输入][神奇的getchar()][进制转换]

Description

 

最近某视频网站将使用已久的 av 视频编号升级成了新的 bv 号,新的编号扩充了编号的字符集,增加了编号的数量。

你是网站的忠实用户,这次升级迫使你将收藏的视频 av 号重新换算成 bv 号以便观看。由于原始算法比较复杂,我们将算法简化如下:

av 号以av开头,之后跟随一串数字,例如av84735341;而 bv 号以BV开头,之后跟随一串数字和字母,例如BV1i7411a794

首先,需要将 av 号中的正整数nn异或上一个较大的正整数XX,再对其进行编码,得到编码后的串SS,最后在SS开头添加BV前缀即可。

这里所使用的编码是指把一个整数转换成一个 62 进制数,并用编码表中指定的每一位代表的符号作为该位的字符,构成编码后的串。

你的收藏中有nn个 av 号,每个 av 号都符合上面的格式。现在你已经获得了异或的正整数XX和编码的编码表(每次使用的XX和编码表可能不同),请你将 av 号转换为 bv 号并输出。

你可以参考样例解释来帮助理解上面的流程。

注:题目纯属虚构,上述算法不一定与真实情况中的编码算法相同。

 

Input 

 

第一行包含两个正整数 n (1≤n≤104)n (1≤n≤104) 和 X (1≤X≤1018)X (1≤X≤1018),代表 av 号的数量和异或的值。

第二行包含一个长为 62 的字符串 TT,TiTi​ 表示编码时某一位的十进制数值为 ii 时对应的编码字符。TT 仅包含英文字母及数字。

接下来 nn 行每行包含一个字符串,分别为要转换的 av 号串,长度不超过 11。

 

Output 

 

输出 nn 行,每行为转换后得到的 bv 号。

 

Sample Input 1 

5 10
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
av1
av2
av314
av17001
av84735341

Sample Output 1

BVb
BV8
BV4U
BV4q7
BV5JxwX

Hint

av17001为例,首先将 17001 与 10 异或,得到 16995,然后将 16995 转换成 62 进制,即 4 26 7,根据编码表可以查到 4 对应 4、26 对应 q、7 对应 7,因此 bv 号为BV4q7

 

就很奇怪就很bad,不加这两个奇怪的getchar()就会wrong answer,加了以后就过了

scanf()原来还能这样用,直接在前面输入av,然后直接用long long的形式输入av后面的数字,就很厉害



// gcd lcm有理数
//  main.cpp
//  猫猫头
//
//  Created by Mintink on 2020/1/12.
//  Copyright © 2020 Mintink. All rights reserved.
//

#include<iostream>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<set>
#include<numeric>
#include<vector>
#include<queue>
#include<array>
#include <stdlib.h>
#include <stdio.h>
#include<cstdio>
#define _USE_MATH_DEFINES
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
//tuple<int,string,int>p[55];
//pair<int,string>male[55],female[55];
int main()
{
    int n;
    ll X;
    cin>>n>>X;
    string s;
    cin>>s;
    getchar();
    while(n>0)
    {
        ll nu;
        scanf("av%lld",&nu);
        getchar();
        nu=nu^X;
        string bv;
        int init=0;
        while(nu>0)
        {
            bv[init++]=s[nu%62];
            nu/=62;
        }
        cout<<"BV";
        for(int i=init-1;i>=0;i--)
        {
            cout<<bv[i];
        }
        cout<<endl;
        n--;
    }
    return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值