注意(1):fgets的用法,比scanf(%s)快,scanf(%s)会超时,字符长度太长;同时fgets会读入换行符,len记得-1
(2)>>符号优先级在+,-运算符后面
#include<iostream>
using namespace std;
#include<cstring>
typedef unsigned int UI;
const int N=1010,M=40*1024*8+10;
int n,s,l;
UI disk[N][M/8/4];
bool st[N];
char str[M];
int len;
char get(UI x) //
{
if(x<=9)
return x+'0';
return x-10+'A';
}
string u2s(UI x) //将4字节无符号整数转为16进制表示
{
string res;
for(int i=7;i>=0;i--)
{
res+=get(x>>(i<<2)&15);
}
return res;
}
UI get(char c)
{
if(c<='9' && c>='0') return c-'0';
return c-'A'+10;
}
int getreal(int r,int c)
{
int col;
r=r%n;
col=n-1-r;
return (col+1+c)%n;
}
int main()
{
scanf("%d%d%d",&n,&s,&l);
for(int i=0;i<l;i++)
{
int k;
scanf("%d",&k);
getchar();
fgets(str,M,stdin);
int sz=strlen(str)-1;
for(int j=0;j<sz;j+=8)
{
UI x=0;
for(int w=0;w<8;w++)
x=(x<<4)+get(str[j+w]);
disk[k][j>>3]=x;
}
st[k]=true;
len=max(len,sz>>3);
}
int m;
cin>>m;
for(int i=0;i<m;i++)
{
int b;
scanf("%d",&b);
if(b>=len*(n-1))
puts("-");
else {
int k=b/s;
int r=b/((n-1)*s);
int col=k%(n-1);
int rr=s*r+b%s;
col=getreal(r,col);
if(st[col]==1) //如果该磁盘有值
{
puts(u2s(disk[col][rr]).c_str());
}else if(l==n-1)
{
UI x=0;
for(int i=0;i<n;i++)
x^=disk[i][rr];
puts(u2s(x).c_str());
}else puts("-");
}
}
return 0;
}