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

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("\n");
            }
        }
        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;
}

 

posted @ 2018-09-18 21:25  litos  阅读(129)  评论(0编辑  收藏  举报