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;
}