哎,这个题好难读,然后是要关闭流同步,不然就t了
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,s,l,m,s_size;
long long tot;
vector<uint8_t> disks[N];
set<int> contain;
uint8_t get(char c) {
if (isdigit(c)) {
return c - '0';
} else {
return c - 'A' + 10;
}
}
void solve(long long rid) {
int tid = rid / s;//条带编号
int k = tid / (n - 1);//求出来k
int disk_stor = (n - 1) - (k % n);
int bg_idx = (disk_stor + 1) % n;//从哪个磁盘开始
int td_id = k * (n - 1);//条带编号
int los = 0;//缺失几个
int tmp = 0;
int tar_disk = (disk_stor + (tid % (n - 1)) + 1) % n;
for (int i = 0; i < n; i++) {
if (!contain.count(i)) {
los++; tmp = i;
}
}
if ((tmp == tar_disk && los > 1)) {
cout << "-\n";
return;
}
if (contain.count(tar_disk)) {
string ret;
int blk = (rid % s) + k * s;
for (int i = blk * 4; i <=blk * 4 + 3; i++) {
uint8_t bt = disks[tar_disk][i];
uint8_t hi = (bt >> 4);
uint8_t lo = (bt % 16);
char h = hi >= 10 ? hi - 10 + 'A' : hi + '0';
char l = lo >= 10 ? lo - 10 + 'A' : lo + '0';
ret.push_back(h);
ret.push_back(l);
}
cout << ret << '\n';
} else {
if (los >= 2) {
cout << "-\n";
} else {
vector<uint8_t> res(4,0);
int blk = (rid % s) + k * s;
for (auto i : contain) {
for (int j = blk * 4; j <= blk * 4+ 3; j++) {
res[j - blk * 4] ^= disks[i][j];
}
}
string ret;
for (int i = 0; i < 4; i++) {
uint8_t bt = res[i];
int hi = (bt >> 4);
int lo = (bt % 16);
char h = hi >= 10 ? hi - 10 + 'A' : hi + '0';
char l = lo >= 10 ? lo - 10 + 'A' : lo + '0';
ret.push_back(h);
ret.push_back(l);
}
cout << ret << '\n';
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin >> n >> s >> l;
for (int i = 0; i < l; i++) {
int num;
string str;
cin >> num;
cin >> str;
contain.insert(num);
for (int j = 0; j < str.size(); j += 2) {
uint8_t nm = ((get(str[j]) << 4) | get(str[j + 1]));
disks[num].push_back(nm);
}
tot = disks[num].size() / 4 * (n - 1);
}
cin >> m;
for (int i = 0; i < m; i++) {
long long rid; cin >> rid;
if (rid >= tot) {
cout << "-\n";
continue;
}
solve(rid);
}
}