这个题竟然卡输入,超时超了我两天,都快疯了,然后挨个试验,最后发现仅仅改了一下接受输入的方法,就简单的通过了,简直shit,卡输入太恶心了
说道这个题,思路非常简单,主要注意以下几点:
- 给定块编号,如何映射到相应的硬盘和相应的块区
- 如果相应的硬盘丢失,如何异或操作
要注意如果硬盘丢失了一块以上,并且要找的正好是那一块硬盘的数据的话,那么肯定就没有办法恢复数据,这里提前判断一下可以减少开销
之后总结一下各种输入方法的开销情况,怎么又在这里被坑了…
#include<cstdio>
#include <cstring>
using namespace std;
char disk[1004][82000];//最大值是40960个字节,每个字符表示半个字节,所以81920个字符长度才能接受完40960个字节
int main() {
int n,s,l;
scanf("%d %d %d",&n,&s,&l);
int chunk_num=-1;
for(int i = 0;i<l;i++)
{
int id;
scanf("%d%*c",&id);
// scanf("%s",disk[id]);
fgets(disk[id],85000,stdin);//这里使用fgets,如果使用scanf的话会超时...卡输入方法我也是醉了
if(chunk_num == -1)
{
int clen = strlen(disk[id]);
chunk_num = clen/8;//一个char半个字节,4个字节组成一个块
}
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int b;//要访问的块编号
scanf("%d",&b);
int line_id = b/s;//条带编号
int k = line_id/(n-1);//k值
int disk_id = line_id%n;
int blk = k*s+b%s;//blk值
int char_blk = blk*8;
if(blk>chunk_num){
printf("-\n");
continue;
}
if(disk[disk_id][0] != '\0')
{
for(int j = char_blk;j<char_blk+8;j++)
{
putchar(disk[disk_id][j]);
}
printf("\n");
}else{
if(n-l>1)
{
printf("-\n");
}else{
int res;
int ndid=0;
while(ndid==disk_id){ndid++;}
sscanf(disk[ndid]+char_blk,"%8X",&res);
ndid++;
int tmp;
for(;ndid<n;ndid++)
{
if(ndid != disk_id)
{
sscanf(disk[ndid]+char_blk,"%8X",&tmp);
res ^= tmp;
}
}
printf("%0*X\n",8,res);
}
}
}
return 0;
}