ACM-ICPC 2018 沈阳赛区网络预赛-I模拟题啊!!!
垃圾题,题目巨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; }
有不懂欢迎咨询
QQ:1326487164(添加时记得备注)