CCF认证 201903-3损坏的RAID5

本文介绍了一种用于RAID阵列数据恢复的算法,该算法通过计算未损坏硬盘上的数据来恢复丢失的数据块。文章详细解释了如何确定数据块在磁盘上的位置,并在特定条件下使用异或运算来重构数据。此算法适用于多种RAID配置,尤其是当一个硬盘故障时的数据恢复场景。

题目描述 

加快输入输出流,最好不用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;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值