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