https://nanti.jisuanke.com/t/31450
题意
给出一个映射(左为ascll值),然后给出一个16进制的数,要求先将16进制转化为2进制然后每9位判断,若前8位有奇数个1且第9位为0则这个子串取,若前8位有偶数个1且第9 位为1也取。取出的串在映射中进行查找,输出对应ascll值的字符
分析
用map直接模拟,细节需要注意。
#include <bits/stdc++.h> using namespace std; #define ms(a, b) memset(a, b, sizeof (a)) typedef long long ll; const int maxn = 1e5+10; //const int inf = 1e9+7; map<string, char> dic; map<string, char> ::iterator it; char s[20]; char data[200010]; char data01[800010]; char r_data[800010]; int HtoD(char x){ if(x>='0'&&x<='9'){ return x - '0'; }else if(x>='A'&&x<='F'){ return x-'A'+10; }else{ return x-'a'+10; } } bool check(int x){ int cnt = 0; for(int i = x;i<x+8;i++){ if(data01[i]=='1') cnt++; } if(cnt&1){ return data01[x+8]=='0'; }else{ return data01[x+8]=='1'; } } int main(){ #ifdef LOCAL freopen("in","r",stdin); // freopen("out.txt","w",stdout); #endif // LOCAL int t; scanf("%d", &t); for(int _=0;_<t;_++){ int m, n, c; scanf("%d%d", &m, &n); dic.clear(); for(int i = 0;i<n;i++){ scanf("%d%s", &c, s); dic[s]=(char)c; } scanf("%s", data); int data_len = strlen(data); for(int i = 0;i<data_len;i++){ int x = HtoD(data[i]); for(int j = 3;j>=0;j--){ if(x&(1<<j)) data01[4*i+3-j] = '1'; else data01[4*i+3-j] = '0'; } } // for(int i = 0;i<data_len*4;i+=4){ // printf("%c", data01[i]); // printf("%c", data01[i+1]); // printf("%c", data01[i+2]); // printf("%c", data01[i+3]); // printf(" "); // } int r_len = 0; for(int i = 0;i<data_len*4;i+=9){ if(i+9<=data_len*4 && check(i)){ for(int j = i;j<i+8;j++){ r_data[r_len++] = data01[j]; // printf("%c", data01[j]); } // printf(" "); } } string query = ""; for(int i = 0;i<r_len;i++){ query += r_data[i]; it = dic.find(query); if(it!=dic.end()){ printf("%c", (*it).second); query = ""; m--; if(m==0) break; } } puts(""); } return 0; }