码迷,mamicode.com
首页 > 其他好文 > 详细

ACM-ICPC 2018 沈阳赛区网络预赛-I模拟题啊!!!

时间:2018-09-11 22:00:03      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:pre   div   i++   break   amp   tor   lse   red   长度   

垃圾题,题目巨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;
}

 

ACM-ICPC 2018 沈阳赛区网络预赛-I模拟题啊!!!

标签:pre   div   i++   break   amp   tor   lse   red   长度   

原文地址:https://www.cnblogs.com/bluefly-hrbust/p/9630524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!