ACM-ICPC 2018 沈阳赛区网络预赛 I. Lattice's basics in digital electronics(trie树,模拟)

题目链接:https://nanti.jisuanke.com/t/31450

《ACM-ICPC 2018 沈阳赛区网络预赛 I. Lattice's basics in digital electronics(trie树,模拟)》

《ACM-ICPC 2018 沈阳赛区网络预赛 I. Lattice's basics in digital electronics(trie树,模拟)》

《ACM-ICPC 2018 沈阳赛区网络预赛 I. Lattice's basics in digital electronics(trie树,模拟)》

 

《ACM-ICPC 2018 沈阳赛区网络预赛 I. Lattice's basics in digital electronics(trie树,模拟)》

 

样例输入 
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;
}

 

    原文作者:Trie树
    原文地址: https://blog.csdn.net/yz467796454/article/details/82532660
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞