ccf损坏的RAID5

笑着哭i 提交于 2019-11-27 12:24:28

提交了只得了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 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!