大家都知道,一辆汽车上路前先要去交警部门申领汽车号牌,号牌由两部分组成,以点字符“.”为分隔符,点字符“.”前部分是省区标识部分,点字符“.”后部分是五位车牌号,为了能够准确识别车牌,有些容易引起混淆的字符被限制使用,我们假设在某一个车牌系统中有如下限制:
1、 车牌是由数字和大写字母组成。
2、 考虑到字符“0”和字母“O”很容易引起混淆,因此系统中没有字母“O”。
3、 考虑到字符“0”和字母“Q”很容易引起混淆,因此系统中没有字母“Q”。
4、 考虑到字符“1”和字母“I”很容易引起混淆,因此系统中没有字母“I”。
5、 考虑到字符“8”和字母“B”很容易引起混淆,因此系统中没有字母“B”。
6、 规定前后顺序是:0、1、2、3、4、……、9、A、C、D、……、Y、Z。当然“Z”的后面又回到起始的“0”
你的任务是:在给定一个任意合法的五位车牌号和一个整数后,请你写个程序自动找出符合顺序要求的前面第若干个号码或者后面第若干个号码的合法的车牌号。
Input
本问题有多组测试数据,每一组只有一行,每一行有两部分组成,前面一部分是一个由五位字符组成的字符串,表示合法的五位车牌号;后面一部分是一个整数n(在32位整型表达范围内),其中正整数n表示请你找出后面第n个合法的车牌号,负整数n表示请你找出前面第n个紧挨着的合法的车牌号,车牌号和n之间用空格分隔。
Output
对于每一组输入,对应的输出也只有一行,即给定的车牌号的前第n个或后第n个合法的车牌号。
Sample Input
12345 -5
12345 8
Sample Output
12340
1234E
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=33554432;
char s[10];
map<int,int>mp;
int hs[100];
int main()
{
int a;
for(int i=0;i<=9;i++)
{
mp[i+'0']=i;
hs[i]=i+'0';
}
int cnt=10;
for(int i=0;i<26;i++)
{
if(i+'A'=='O')continue;
if(i+'A'=='Q')continue;
if(i+'A'=='I')continue;
if(i+'A'=='B')continue;
mp[i+'A']=cnt;
hs[cnt]=i+'A';
cnt++;
}
while(~scanf("%s%d",s,&a))
{
ll b=0;
ll c=32ll*32*32*32;
for(int i=0;i<5;i++)
{
b=b+c*mp[s[i]];
c/=32;
}
b+=a;
b=(b%mod+mod)%mod;
string s="";
while(b)
{
s+=hs[b%32];
b/=32;
}
while(s.size()<5)
s+='0';
reverse(s.begin(),s.end());
cout<<s<<endl;
}
return 0;
}