CCF认证 201903-3损坏的RAID5

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<set>
#include <cctype>
#include<map>
#include<regex>
using namespace std;

int n, s, l;
char disk[1005][40 * 2 * 1024+5],temp[10];
bool dd[1005];

int main() {
	//freopen("input.txt", "r", stdin);

	scanf("%d%d%d", &n, &s, &l);
	int index, maxBlock;

	for (int i = 0; i < l; i++) {
		scanf("%d\n", &index);
		dd[index] = true;
		//scanf("%s", disk[index]);
		fgets(disk[index], 40 * 2 * 1024 + 5, stdin);
		maxBlock = strlen(disk[index]) / 8;
	}
	int num;
	scanf("%d", &num);
	while (num--) {
		scanf("%d", &index);
		int tiaodai = index / s;//所属条带编号
		int tiaodaiceng = tiaodai / (n - 1);//条带层数
		int dijigetiaodai = tiaodai % (n - 1);//该层第几个条带
		int index_in_tiaodai = index % s;//块是条带中的第几个块
		int pindex = n - tiaodaiceng;//该层第几个是p
		int index_disk = (pindex +dijigetiaodai)%n;//第几个磁盘
		int index_block = tiaodaiceng * s + index_in_tiaodai;//磁盘中第几块
		int index_begin = index_block * 8;
		if ((l < n - 1&&dd[index_disk]==false)||index_block>maxBlock) {
			printf("-\n");
		}
		else if (dd[index_disk] == true) {
			//这块磁盘存在
			for (int i = 0; i < 8; i++) {
				printf("%c", disk[index_disk][index_begin + i]);
				if (i == 7)
					printf("\n");
			}

		}
		else {
			int ans = 0, k;
			for (int i = 0; i < n; ++i) {//遍历其他的块
				if (index_disk != i) {
					for (int j = 0; j < 8; ++j)//将对应的8个字符复制粘贴到temp中
						temp[j] = disk[i][index_begin + j];
					temp[8] = '\0';//temp末尾字符置\0
					sscanf(temp, "%x", &k);//将16进制字符串转换为10进制数
					ans ^= k;//进行异或运算
				}
			}
			printf("%08X\n", ans);//输出8位16进制字符串,不够8位在高位补0
			
		}
		
	}

	return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值