题目链接:http://118.190.20.162/view.page?gpid=T87
思路: 给定查询块的编号后,结合阵列中硬盘的数目和条带大小计算出块所在的硬盘号以及在该硬盘的位置,然后直接取数据就可以.如果找到的是数据缺失的硬盘,则使用其他硬盘的异或值算出即可.
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
string str[1010];
int id[1010];
int n,s,l,m;
int len;
char getNumber(char c){
if(c>='0'&&c<='9'){
return c-'0';
}
else if(c>='A'&&c<='E'){
return c-'A'+10;
}
return c;
}
string getXor(string str,string other){
for(int i=0;i<str.size();i++){
str[i]=getNumber(str[i])^getNumber(other[i]);
}
return str;
}
void getData(int r){
int d=r/((n-1)*s);
int p=(n-d%n)-1;
int b=d*s+r%s;
int disk=(r%((n-1)*s)/s+p+1)%n;
if(len<b*8+8){
cout<<"-"<<endl;
return;
}
if(str[disk].size()!=0){
cout<<str[disk].substr(b*8,8)<<endl;
}
else if(str[disk].size()==0&&l==n-1){
string tmp_str="00000000";
for(int i=0;i<n;i++){
if(i!=disk){
tmp_str=getXor(tmp_str,str[i].substr(b*8,8));
}
}
cout<<tmp_str<<endl;
} else{
cout<<"-"<<endl;
}
}
int main() {
//不开cin加速只有10分
ios::sync_with_stdio(false);
cin>>n>>s>>l;
for(int i=0;i<l;i++){
int idx;
string tmp;
cin>>idx;
cin>>str[idx];
len=str[idx].size();
}
cin>>m;
for(int i=0;i<m;i++){
cin>>id[i];
}
for(int i=0;i<m;i++){
getData(id[i]);
}
return 0;
}