参考博客https://www.cnblogs.com/xidian-mao/p/10991393.html
题目:
思路:关键是要理清块号、条带号、磁盘号之间的对应关系。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
string book="0123456789ABCDEF";
int n,m,s,l,_maxk;
int id;
string a[10005];
int _toint(char ch)
{
if(ch>='0'&&ch<='9')
{
return(ch-'0');
}
else
{
return(ch-'A'+10);
}
}
void _xor(string &s1,string s2)
{
for(int i=0;i<s2.size();i++)
{
int x=_toint(s1[i]);
int y=_toint(s2[i]);
s1[i]=book[(x^y)];
}
}
string result(int disk,int start)
{
string s1(8,'0');
for(int i=0;i<n;i++)
{
if(i!=disk)
{
_xor(s1,a[i].substr(start,8));
}
}
return s1;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>s>>l;
//s为阵列条带大小,单位为块
//2个字符等于一个字节,一个块为4个字节,8个字符
for(int i=0;i<l;i++)
{
cin>>id;
cin>>a[id];
_maxk=a[id].size()/8/s;//最大的条带数目
}
cin>>m;
while(m--)
{
int b;
cin>>b;//要读取的块的编号
int y=b/s;//y是条带号
int k=y/(n-1);//k是条带在第k排
int k1=(y%(n*n-n))/(n-1);//k1是数据带在第k1排
int rd1=(n-1)-k1%n;//rd1是冗余带所在的磁盘编号
int diskid=(y%(n*n-n)+1-k1*(n-1)+rd1)%n;//diskid是数据带所在的磁盘编号
if(k>=_maxk)cout<<"-"<<endl;
else if(a[diskid].size()!=0)
{
cout<<a[diskid].substr(8*(b%s+k1*s),8)<<endl;
}
else if(a[diskid].size()==0&&(l==n-1))
{
cout<<result(diskid,8*(b%s+k1*s))<<endl;
}
else
{
cout<<"-"<<endl;
}
}
return 0;
}