版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yz467796454/article/details/82532660
题目链接:https://nanti.jisuanke.com/t/31450
样例输入
2
15 9
32 0100
33 11
100 1011
101 0110
104 1010
108 00
111 100
114 0111
119 0101
A6Fd021171c562Fde1
8 3
49 0001
50 01001
51 011
14DB24722698
样例输出
hello world!!!!
12332132
题意:给一系列二进制到ASCII的映射,给出一个十六进制数,需要你转化为二进制01串,然后9位9位得取,前八位的1的个数如果是偶数,第九位为1,说明校验结果正确,或者1的个数为奇数,第九位为0,校验结果正确,校验结果正确则保留前八位,反之舍弃这九位,不足九位的直接舍弃。最后通过上面的映射,输出得到的ASCII码对应字符的前m个字符。(题意很迷,直接看hint比较好理解)
思路:trie树,把ASCII码存在了sum中,初始化sum为-1,当root向下走,走到一个sum不为-1,就是找到了某个映射,直接输出
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 110005
int trie[400001][5],len,root,tot,sum[400001];
bool p;
int n,m;
char s[20];
void insert(int x)
{
len=strlen(s);
root=0;
for(int i=0;i<len;i++)
{
int id=s[i]-'0';
if(!trie[root][id]) trie[root][id]=++tot;
root=trie[root][id];
}
sum[root]=x;
}
char st[200005*4];
char stt[200005*4];
int main(){
int t;
scanf("%d",&t);
while(t--){
int m,n;
scanf("%d%d",&m,&n);
memset(sum,-1,sizeof(sum));
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
scanf("%s",s);
insert(x);
}
char str[200005];
scanf("%s",str);
int num=0;
for(int i=0;i<strlen(str);i++){//进制转化不要用这个写法!虽然我自己复制粘贴挺快乐的
if(str[i]=='0'){st[num++]='0';st[num++]='0';st[num++]='0';st[num++]='0';}
else if(str[i]=='1'){st[num++]='0';st[num++]='0';st[num++]='0';st[num++]='1';}
else if(str[i]=='2'){st[num++]='0';st[num++]='0';st[num++]='1';st[num++]='0';}
else if(str[i]=='3'){st[num++]='0';st[num++]='0';st[num++]='1';st[num++]='1';}
else if(str[i]=='4'){st[num++]='0';st[num++]='1';st[num++]='0';st[num++]='0';}
else if(str[i]=='5'){st[num++]='0';st[num++]='1';st[num++]='0';st[num++]='1';}
else if(str[i]=='6'){st[num++]='0';st[num++]='1';st[num++]='1';st[num++]='0';}
else if(str[i]=='7'){st[num++]='0';st[num++]='1';st[num++]='1';st[num++]='1';}
else if(str[i]=='8'){st[num++]='1';st[num++]='0';st[num++]='0';st[num++]='0';}
else if(str[i]=='9'){st[num++]='1';st[num++]='0';st[num++]='0';st[num++]='1';}
else if(str[i]=='A'||str[i]=='a'){st[num++]='1';st[num++]='0';st[num++]='1';st[num++]='0';}
else if(str[i]=='B'||str[i]=='b'){st[num++]='1';st[num++]='0';st[num++]='1';st[num++]='1';}
else if(str[i]=='C'||str[i]=='c'){st[num++]='1';st[num++]='1';st[num++]='0';st[num++]='0';}
else if(str[i]=='D'||str[i]=='d'){st[num++]='1';st[num++]='1';st[num++]='0';st[num++]='1';}
else if(str[i]=='E'||str[i]=='e'){st[num++]='1';st[num++]='1';st[num++]='1';st[num++]='0';}
else if(str[i]=='F'||str[i]=='f'){st[num++]='1';st[num++]='1';st[num++]='1';st[num++]='1';}
}
int i=0;
int su=0;
int len=0;
while(i<num){//校验
if(st[i]=='1')su++;
i++;
if((i+1)%9==0){
if(st[i]=='1'){
if(su%2==0){
for(int k=i-8;k<i;k++){
stt[len++]=st[k];
}
}
}
else{
if(su%2==1){
for(int k=i-8;k<i;k++){
stt[len++]=st[k];
}
}
}
i++;
su=0;
}
}
stt[len]='\0';
int k=0;
root=0;
for(i=0;i<len;i++){//对照输出
int id=stt[i]-'0';
root=trie[root][id];
if(sum[root]!=-1){
printf("%c",(char)sum[root]);
root=0;
k++;
if(k==m){
printf("\n");
break;
}
}
}
}
return 0;
}