题目见搜索引擎或者官网。
我的GitHub还有其他CCF-CSP题目的python实现,可以交流交流。
发现一个基本上没有人注意的漏洞…
CCF-CSP官网的测试样例没有考虑缺失块的处理…
在把无法推算的两种情况与读取块在已知硬盘中情况考虑后 我把代码提交上去就是100分!!但是我还没写读取块在缺失盘上的情况!
不知道在上次考试的时候是怎么给的测试样例…大家可以去试试
我还是把代码写完整。
参考了他人的C++代码的思路,很聪明的方法!
注意:所有编号均从0开始
根据观察与规律:(e.g. y以x为周期变化, 则考虑y%x)
def Mapping(x: int, n: int, s: int) -> int:
y = x // s
k = y // (n - 1)
c = n - k % n - 1
d = (c + y % (n - 1) + 1) % n
b = x % s + k * s
return (b, d) # 第d号盘的第b个块 则从8 * b号位开始输出硬盘内容8位
def xor(a: str, b: str) -> str:
l = len(a) # len(a) == len(b)
dec_a, dec_b = int(a, base=16), int(b, base=16)
x = hex(dec_a ^ dec_b)[2 :].rjust(l).upper()
return x
def XOR(all: dict, start: int) -> str:
keys = list(all)
l = len(keys)
result = xor(all[keys[0]][start : start + 8], all[keys[1]][start : start + 8])
i = 2
while i < l:
result = xor(result, keys[i][start : start + 8])
i += 1
return result
n, s, l = map(int, input().split())
left_disks = dict()
max_b = 0 # 最大块号
for i in range(l):
temp = input().split()
left_disks[temp[0]] = temp[1]
max_b = len(temp[1]) // 8
r = int(input())
read = []
for i in range(r):
read.append(Mapping(int(input()), n, s))
for i in read:
b, d = i
if b > max_b: # 指定的块超出阵列总长度
print('-')
elif str(d) in left_disks.keys(): # 块在已知硬盘中
print(left_disks[str(d)][8 * b : 8 * b + 8])
elif l == n - 1: # 最多缺失一个硬盘
print(XOR(left_disks, 8 * b))
else: # 无法推算
print('-')
# 测试样例
'''
2 1 2
0 000102030405060710111213141516172021222324252627
1 000102030405060710111213141516172021222324252627
2
0
1
3 2 2
0 000102030405060710111213141516172021222324252627
1 A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7
2
2
5
'''