- 需要处理大量输入输出的时候,得请出
cin.tie(NULL)
和sync_with_stdio(false)
俩兄弟。
- 不能直接把缺的一整块给算出来,服气。太细了,考试时可能不会注意。
#include <iostream>
#include <cctype>
#include <vector>
using namespace std;
int char_to_int(char c) { return isdigit(c) ? c - '0' : c - 'A' + 10; }
char int_to_char(int x) { return x >= 10 ? x - 10 + 'A' : x + '0'; }
string exclusiveOr(const string& a, const string& b) {
if (a.empty()) return b;
string res;
for (int i = 0; i < a.size(); ++i)
res.push_back(int_to_char(char_to_int(a[i]) ^ char_to_int(b[i])));
return res;
}
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int n, s, l;
cin >> n >> s >> l;
vector<string> disks(n);
int N;
for (int i = 0; i < l; ++i) {
int idx;
string s;
cin >> idx >> s;
disks[idx] = s;
N = s.length();
}
int totalNumOfBlocks = (N >> 3) * (n - 1);
int m;
cin >> m;
while (m--) {
int query;
cin >> query;
if (query >= totalNumOfBlocks) {
cout << "-" << endl;
continue;
}
int k = query / (s * (n - 1));
int start = n - 1 - k % n;
int diskIdx = (start + query % (s * (n - 1)) / s + 1) % n;
int blockIdx = k * s + query % s;
if (disks[diskIdx].empty()) {
if (n - 1 == l) {
string res;
for (int i = 0; i < n; ++i) if (!disks[i].empty())
res = exclusiveOr(res, disks[i].substr(blockIdx << 3, 8));
cout << res << endl;
} else {
cout << "-" << endl;
}
} else {
cout << disks[diskIdx].substr(blockIdx << 3, 8) << endl;
}
}
return 0;
}