垃圾题,题目巨TM长。。。这题题意就是说给你一个16进制串,让你把每一位转成长度为4的2进制数,并把这些数连接起来,连接完成后,进行奇偶校验,把字符串切割成每个长度为9的字符串,然后计算前8位的

1的个数,,最后一位是校验位,如果1的个数为奇数 那么校验位应该是1,如果1的个数为偶数,那么校验位应该是0,如果满足,就保留验证的8位去掉校验位,否则去掉整个;然后给了M个字符串对应的ASCll,把验证位置留下来的东西,进行和字符串匹配,然后输出N个对应ASCll的字符???

这题意很绕啊。。。不过纯模拟很烦啊,用unorder_map的快速查找和string的可加性,以及string.substr的强大功能这题迎刃而解啦!!!

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<unordered_map>
#include<map>
#include<vector>
#pragma GCC optimize(2)
using namespace std;
unordered_map<string,int> mp;
unordered_map<char,string> table;
void init(){
  table['0']="0000";
  table['1']="0001";
  table['2']="0010";
  table['3']="0011";
  table['4']="0100";
  table['5']="0101";
  table['6']="0110";
  table['7']="0111";
  table['8']="1000";
  table['9']="1001";
  table['a']="1010";
  table['A']="1010";
  table['B']="1011";
  table['b']="1011";
  table['C']="1100";
  table['c']="1100";
  table['D']="1101";
  table['d']="1101";
  table['E']="1110";
  table['e']="1110";
  table['F']="1111";
  table['f']="1111";
}
int main(){
   int t;
   int n,m;
   string s;
   string str2;
   string ans;
   scanf("%d",&t);
   init();
   vector<int>vec;
   while(t--){
      vec.clear();
      mp.clear();
      scanf("%d%d",&n,&m);
      int tmp;
      string tmps;
      for (int i=1;i<=m;i++){
         cin>>tmp>>tmps;
         mp[tmps]=tmp;
      }
      cin>>s;
      int len=s.length();
      str2.clear();
      ans.clear();
      tmps.clear();
      for (int i=0;i<len;i++){
         str2+=table[s[i]];
        // cout<<table[s[i]]<<" ";
      }
     //cout<<str2<<endl;
      len=str2.length();

      for(int i=0;i<len;i+=9){
        tmps=str2.substr(i,9);
        //cout<<tmps<<" ";
        int cnt=0;
        if (tmps.length()!=9)break;
        for (int j=0;j<8;j++){
            if (tmps[j]=='1')cnt++;
        }
        //cout<<cnt<<endl;
        if(cnt%2==0 && tmps[8]=='1'){
            ans+=tmps.substr(0,8);
        }else if (cnt%2==1 && tmps[8]=='0'){
            ans+=tmps.substr(0,8);
        }
        tmps.clear();
      }
      len=ans.length();
      tmps.clear();
      for (int i=0;i<len;i++){
        tmps+=ans[i];
        if (mp[tmps]!=0){
           vec.push_back(mp[tmps]);
           tmps.clear();
        }
      }
      int sz=vec.size();
      for (int i=0;i<sz;i++){
        if (i==n)break;
        printf("%c",vec[i]);
      }
      printf("\n");
   }
  return 0;
}