题目描述

加快输入输出流,最好不用scanf printf和cin cout混合使用 ;加快一方另一方受损,导致超时
重点:理清输入的块所在的磁盘号以及所在磁盘号的具体位置
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
const string base="0123456789ABCDEF";
string a[N];
int n,s,l,max_n,m;
int _toint(char ch){
if(ch>='0'&&ch<='9') return ch-'0';
else
return ch-'A'+10;
}
void _xor(string& ans,string str){
for(int i=0;i<str.size();i++){
int x=_toint(ans[i]);
int y=_toint(str[i]);
ans[i]=base[(x^y)];
}
}
string get_xor(int disk,int _start){
//string ans="00000000";
string ans(8,'0');
for(int i=0;i<=n;i++){
if(i!=disk){
_xor(ans,a[i].substr(_start,8));
}
}
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>s>>l;//n硬盘的数目 s阵列的条带大小(单位块)
//scanf("%d%d%d",&n,&s,&l);
n-=1;
//现存的硬盘数目
int id;//输入硬盘的标号
//string ss;//输入硬盘中的内容
//int max_n;//最大的条带数目
for(int i=1;i<=l;i++){
//scanf("%d",&id);
cin>>id;
cin>>a[id];
max_n=a[id].size()/8/s;
}
//scanf("%d",&m);
cin>>m;
while(m--){
int x;
cin>>x;//要读取的块的编号
//scanf("%d",&x);
int y=x/s;//y是条带号
int k=y/n;//第几排
//int rd=(n-k%(n+1));//第k排冗余带的位置
//cout<<"rd="<<rd<<endl;
//第k排数据带的起始位置
//int begin=(rd+1)%n;
int _start=8*(k*s+x%s);//dsk的第几块 的字符串的位置
//编号b所在的盘号为
//int dsk=(rd+y%n+1)%(n+1);
int dsk=(n-k%(n+1)+y%n+1)%(n+1);
//cout<<"dsk="<<dsk<<endl;
if(k>=max_n) cout<<"-\n";
//printf("-\n");
else if(a[dsk].size()!=0){
//int _start=8*(k*s+x%s);
cout<<a[dsk].substr(_start,8)<<endl;
//printf("%s\n",a[dsk].substr(_start,8).c_str());
}else if(a[dsk].size()==0&&l==n){
//int _start=8*(k*s+x%s);
cout<<get_xor(dsk,_start)<<endl;
//printf("%s\n",get_xor(dsk,_start).c_str());
}else{
cout<<"-\n";
//printf("-\n");
}
}
return 0;
}
本文介绍了一种用于RAID阵列数据恢复的算法,该算法通过计算未损坏硬盘上的数据来恢复丢失的数据块。文章详细解释了如何确定数据块在磁盘上的位置,并在特定条件下使用异或运算来重构数据。此算法适用于多种RAID配置,尤其是当一个硬盘故障时的数据恢复场景。
6551

被折叠的 条评论
为什么被折叠?



