目录
这冗长的题目
思路
主要还是看图理解!
把每个变量先输出来检查一下
这里是样例二的检查数据:
3 2 2
0 000102030405060710111213141516172021222324252627
1 A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7
12
0
1
2
3
4
5
6
7
8
9
10
11
代码
#include <bits/stdc++.h>
using namespace std;
int n,s,l,m,b;
const string base="0123456789ABCDEF";
const int N = 1e3+10;
string d[N];
int maxk[N];
int value(char c)
{
if(c>='0'&&c<='9') return c-'0';
else return c-'A'+10;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>s>>l;
int id;
memset(maxk,0,sizeof(maxk));
for (int i=0;i<l;i++)
{
cin>>id;
cin>>d[id];
maxk[id]=d[id].size()/8/s;
}
cin>>m;
while(m--)
{
cin>>b;
//所查询点与第x行的P同行(从0开始标号)
int x=b/s/(n-1);
//这一行P的位置在Dsk p
int p=(n-1)-x%n;
int blk=b%s+x*s;
int dsk=(p+b/s-x*(n-1)+1)%n;
//被读取的块丢失
if (x>=maxk[dsk]&&maxk[dsk]!=0)
cout<<"-\n";
//直接读取
else if (maxk[dsk]!=0)
cout<<d[dsk].substr(blk*8,8)<<endl;
//读取的数据需要运算
else if (maxk[dsk]==0&&l>=n-1)
{
//判断n-1块同一行的数据都存在
bool flag=0;
for (int i=0;i<n;i++)
if (i!=dsk)
if (maxk[i]<=x)
{
cout<<"-\n";
flag=1;
break;
}
if (flag) continue;
//异或运算
string ans="00000000",str;
for (int i=0;i<n;i++)
if (i!=dsk)
{
str=d[i].substr(blk*8,8);
for(int j=0;j<8;j++)
ans[j]=base[value(ans[j])^value(str[j])];
}
cout<<ans<<endl;
}
else cout<<"-\n";
}
return 0;
}
吐槽
样例似乎有点弱哎,如果每个disk存储的长度不同 ,也是有可能算不出来的。可是似乎大家没有考虑这种情况也过了。
唉,考试的时候简直就是一脸懵逼了,读题困难。