201903-3 损坏的RAID5 100分 171ms

点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
在这里插入图片描述
这道题说难不难,说简单也不简单,这个逻辑算是初中的吧,几个关系推算。
要非常非常有耐心,只要这几个关系找准了,绝对满分。
如果你学过操作系统这道题会更简单。

#include<iostream>
#include<unordered_map>
#include<sstream>
#include<iomanip>
using namespace std;
unsigned int n,s,l,m,N,M;
string S[1000]{};
stringstream ss;
unordered_map<unsigned int,unsigned int> V;
const unsigned int& getNum(const unsigned int& b, const unsigned int& d, const unsigned int& k){
//将绝对块号为b的在d号磁盘的k深度的16进制字符串数字转换为10进制无符号数字  每8个字符为一个深度
	if(V.find(b)!=V.end()) return V.find(b)->second;
	string s=S[d].substr(k*8,8);
	ss.str(""),ss.clear();
	ss<<hex<<"0x"<<s;
	unsigned int l;
	ss>>l;
	return V[b]=l;
}
void procBlock(const int& bp){查找块号为bp的磁盘内容
	if(bp<M){//如果在读取范围
		int b=bp/N/s;//之前总共的'单位'条带数
		int P=N-b%n;//校验位所在的磁盘号 
		int k=bp%s;//校验位及该块所在磁盘的相对块号
		int d=(bp%(N*s)/s+P+1)%n;//该块所在的磁盘号
		int _k=b*s+k;//该条带的深度 
		int _b=b*n*s+k*n;//该深度前的块数
		int _P=_b+P;//校验位所在的绝对块号
		int _d=_b+d;//该块所在的绝对块号 
//		cout<<setw(3)<<dec<<bp<<" "<<setw(3)<<b<<" "<<P<<" "<<k<<" "<<d<<" "<<setw(3)<<_P<<" "<<setw(3)<<_d<<" "<<setw(3)<<_k<<" ";//测试
		if(S[d].empty()){//如果该块所在的磁盘缺失
			if(l<N) cout<<"-"<<endl;//不能推导出来
			else{
				unsigned int l=getNum(_P,P,_k);
				for(int i=0;i<n;++i) if(i!=P&&i!=d) l^=getNum(i+_b,i,_k);
				cout<<setiosflags(ios::uppercase)<<hex<<setw(8)<<l<<endl;
			}
		}
		else{//输出该块内容
			for(int i=_k*8,ni=i+8;i<ni;++i) cout<<S[d][i]; cout<<endl;
		}
	}
	else
		cout<<"-"<<endl;
}
//#include<fstream> 
int main(){
//	ifstream cin("out.txt");//测试
	std::ios_base::sync_with_stdio(false),cin.tie(NULL);//加速输入
	cin>>n>>s>>l,N=n-1,cout.fill('0');
	for(int i=0;i<l;++i)cin>>M,cin>>S[M];
	cin>>m,M=(S[M].size()/8)*N;//M是可以读取的最大块号+1
//	cout<<dec<<M<<endl; cout<<" i "<<"  b  "<<"P "<<"k "<<"d "<<"_P "<<" _d "<<" _k "<<endl;for(int i=0,a;i<m;++i) procBlock(i);//测试
	for(int i=0,a;i<m;++i) cin>>a,procBlock(a);//处理
	return 0;
}
/*
2 1 2
0 0001020304050607010111213141516172021222324252627
1 0001020304050607010111213141516172021222324252627
2
0
1

3 2 2
0 000102030405060710111213141516172021222324252627000102030405060710111213141516172021222324252627000102030405060710111213141516172021222324252627000102030405060710111213141516172021222324252627000102030405060710111213141516172021222324252627000102030405060710111213141516172021222324252627000102030405060710111213141516172021222324252627000102030405060710111213141516172021222324252627000102030405060710111213141516172021222324252627000102030405060710111213141516172021222324252627
1 A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7
2
2
5
*/
发布了107 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/best335/article/details/100112192
今日推荐