试题编号: 201903-3
试题名称: 损坏的RAID5
时间限制: 1.0s
内存限制: 512.0MB
思路:
x = b / s; 所在条带号
y = x / (n - 1); 此条带在第几排
ry = n - y%n -1 ; 此排冗余带所在位置
k = (ry + x % (n - 1) + 1) % n; 此条带所在磁盘
start = (y*s + b%s) * 8; 数据开始的位置
问题:
1、输入输出:可以用cin 但是要禁用同步 否则会出现超时30分 ios::sync_with_stdio(false);
2、 cin>>num>>st[num] 会报错
cin >> num; cin >> st[num]; 是可以的 为什么不知道
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
const string base = "0123456789ABCDEF";
string st[1001];
int n, s, l;
int string_int(char c) {
if (c >= '0'&&c <= '9')
return c - '0';
else
return c - 'A' + 10;
}
void raid(int kk,int sstart) {
string s1 = "00000000", s2;
for (int i = 0; i < n; i++) {
if (i != kk){
s2 = st[i].substr(sstart, 8);
for (int j = 0; j < s2.length(); j++)
s1[j] = base[string_int(s1[j]) ^ string_int(s2[j])];
}
}
cout << s1 << endl;
}
int main() {
ios::sync_with_stdio(false);
int m, b, num, i, j, len_k, x, y, ry, k, start ;
cin >> n >> s >> l;
for (i = 0; i < l; i++)
{
cin >> num;
cin >> st[num]; //注意: cin>>num>>st[num] 会报错 why?
}
len_k = st[num].length() / 8 / s; //总条带数
cin >> m;
for (i = 0; i < m; i++)
{
cin >> b;
x = b / s; //所在条带号
y = x / (n - 1); //此条带在第几排
ry = n - y%n -1 ; //此排冗余带所在位置
k = (ry + x % (n - 1) + 1) % n; //此条带所在磁盘
start = (y*s + b%s) * 8; //数据开始的位置
if (y >= len_k) //>= 只大于会出错 之前没注意
cout << "-" << endl;
else if (st[k].length() != 0)
cout << st[k].substr(start, 8) << endl;
else if (st[k].length() == 0 && l == n - 1)
raid(k, start);
else
cout << "-" << endl;
}
return 0;
}
/*
3 2 2
0 000102030405060710111213141516172021222324252627
1 A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7
2
2
5
*/