#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<set>
#include <cctype>
#include<map>
#include<regex>
using namespace std;
int n, s, l;
char disk[1005][40 * 2 * 1024+5],temp[10];
bool dd[1005];
int main() {
//freopen("input.txt", "r", stdin);
scanf("%d%d%d", &n, &s, &l);
int index, maxBlock;
for (int i = 0; i < l; i++) {
scanf("%d\n", &index);
dd[index] = true;
//scanf("%s", disk[index]);
fgets(disk[index], 40 * 2 * 1024 + 5, stdin);
maxBlock = strlen(disk[index]) / 8;
}
int num;
scanf("%d", &num);
while (num--) {
scanf("%d", &index);
int tiaodai = index / s;//所属条带编号
int tiaodaiceng = tiaodai / (n - 1);//条带层数
int dijigetiaodai = tiaodai % (n - 1);//该层第几个条带
int index_in_tiaodai = index % s;//块是条带中的第几个块
int pindex = n - tiaodaiceng;//该层第几个是p
int index_disk = (pindex +dijigetiaodai)%n;//第几个磁盘
int index_block = tiaodaiceng * s + index_in_tiaodai;//磁盘中第几块
int index_begin = index_block * 8;
if ((l < n - 1&&dd[index_disk]==false)||index_block>maxBlock) {
printf("-\n");
}
else if (dd[index_disk] == true) {
//这块磁盘存在
for (int i = 0; i < 8; i++) {
printf("%c", disk[index_disk][index_begin + i]);
if (i == 7)
printf("\n");
}
}
else {
int ans = 0, k;
for (int i = 0; i < n; ++i) {//遍历其他的块
if (index_disk != i) {
for (int j = 0; j < 8; ++j)//将对应的8个字符复制粘贴到temp中
temp[j] = disk[i][index_begin + j];
temp[8] = '\0';//temp末尾字符置\0
sscanf(temp, "%x", &k);//将16进制字符串转换为10进制数
ans ^= k;//进行异或运算
}
}
printf("%08X\n", ans);//输出8位16进制字符串,不够8位在高位补0
}
}
return 0;
}
08-28
1211
01-03
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交