Pro3
原始文件为 CPP 代码,本文是转换后的 Markdown 文件。
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <vector>
#include <map>
#include <algorithm>
#include <stack>
using namespace std;
char hex_to_str[16];
int str_to_hex[100];
void init()
{
for (int i = 0; i <= 9; ++i)
{
hex_to_str[i] = (i+'0');
str_to_hex[i+'0'] = i;
}
for (int i = 0; i < 6; ++i)
{
hex_to_str[i+10] = (i+'A');
str_to_hex[i+'A'] = 10+i;
}
}
void compute(string& str1,string& result)
{
for (int i = 0; i < 8; ++i)
{
int ans = str_to_hex[str1[i]] ^ str_to_hex[result[i]];
result[i] = hex_to_str[ans];
}
}
int main()
{
ios::sync_with_stdio(false);
const int maxn = 1005;
string disk[maxn];
bool disk_useful[maxn];
memset(disk_useful,false,sizeof(disk_useful));
freopen("in2.txt","r",stdin);
uint32_t n,s,l; cin >> n >> s >> l;
init();
n = n - 1;
uint32_t num = 0;
for (uint32_t i = 0; i < l; ++i)
{
uint32_t index; cin >> index;
disk_useful[index] = true;
cin >> disk[index];
++num;
}
int m; cin >> m;
for (int i = 0; i < m; ++i)
{
int index; cin >> index;
int line = index/(n*s);
int left = index%(n*s);
int order = n - (line % (n+1));
int diskindex = (order + left/s + 1) % (n+1);
int bulkindex = line*s+left%s;
if (diskindex > n || bulkindex*8 >= disk[diskindex].size())
{
cout << "-" << endl;
continue;
}
if (disk_useful[diskindex])
{
cout << disk[diskindex].substr(bulkindex*8,8) << endl;
}else
{
if (num < n)
{
cout << "-" << endl;
break;
}
string result = "00000000";
bool flag = true;
for (int i = 0; i <= n; ++i)
{
if (i == diskindex) continue;
string test = disk[i].substr(8*bulkindex,8);
compute(test,result);
}
if (flag)
{
cout << result << endl;
}else
{
cout << "-" << endl;
}
}
}
}