需要处理大量输入输出的时候,得请出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;
}
转载请注明原文地址: https://mac.8miu.com/read-489015.html