ccf损坏的RAID5


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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM