提交了只得了60分,应该是最后的大数据样例没过
先放在博客里
1 #include<iostream>
2 #include<string>
3 #include<cstring>
4 #include<cstdio>
5
6 using namespace std;
7 char disk[1000][85000];
8
9 int main()
10 {
11 int n, s, l;
12 cin >> n >> s >> l;
13 for (int i = 0; i < l; ++i)
14 {
15 int k;
16 cin >> k;
17 scanf("%s", disk[k]);
18 }
19
20 //计算block所在的位置
21 int m;
22 cin >> m;
23 for (int i = 0; i < m; ++i)
24 {
25 int block,level,diskn,index;
26 int level_block_number = (n - 1) * s;
27 cin >> block;
28 level = block / level_block_number;
29 diskn = (n-level+(block % level_block_number) / s ) % n;
30 index = block % s; //index为要求的block在条带中的位置
31 //在数组中找到这一段数据
32 //disp是在字符数组中的下标
33 //读取一块的大小(4字节),也就是8个字符
34 int disp = (level * s + index) * 8;
35 //如果要读取数据的盘未损坏且长度够
36 if (disk[diskn][disp]!= '\0')
37 {
38 char tmp[9]="";
39 strncpy(tmp,disk[diskn]+disp,8);
40 printf("%s\n",tmp);
41 }
42 else if (disk[diskn][0]=='\0'&&disk[(diskn+1)%n][disp]!='\0'&& n - 1 == l)
43 {
44 char iter[9]="";
45 int x=0,t;
46 for (int j = 0; j < n; ++j)
47 {
48 if (j != diskn)
49 {
50 strncpy(iter,disk[j]+disp,8);
51 sscanf(iter,"%x",&t);
52 x^=t;
53 }
54 }
55 printf("%08X\n", x);
56 }
57 else printf("-\n");
58
59 }
60
61 return 0;
62 }