本题使用的是循环异或算法。
由于每个十六进制字符都对应4位二进制,所以可以直接按十六进制字符进行处理。
对于data中的第i个字符:
给定两个由十六进制字符组成的字符串,分别称为密钥 key 和数据 data。字符串中的合法字符为数字 0~9 以及大写字母 A~F。要求按循环使用密钥的方式,对 data 逐字符进行异或,生成一个新的十六进制字符串。
具体规则如下:
4 位二进制数:字符 0 到 F 分别对应 0000 到 1111。0 开始计数,将其与 key 的第 imodm 个字符配对。4 位二进制数,然后对相同位置上的二进制位执行异或操作。4 位二进制数转换回大写十六进制字符,并按 data 中的字符顺序依次拼接。因此,当 key 比 data 短时,key 会从左侧起反复使用;当 key 的长度不小于 data 时,只使用 key 中与 data 等长的前缀部分。
约束条件
1,且不超过 10000 个字符。0~9 和大写字母 A~F。第一行包含一个整数 T,表示测试用例的数量。
接下来 T 行,每行包含两个由空格分隔的字符串,分别表示 key 和 data。
对于每组测试用例,输出一行,为一个长度与 data 相同的大写十六进制字符串,表示按上述规则进行循环异或后的结果。
输入
1
0 0
输出
0
说明
key 和 data 的长度均为 1,因此只进行一次异或。
十六进制字符 0 的二进制表示为 0000,与自身按位异或后仍为 0000。
将 0000 转换回十六进制字符,得到 0。
输入
1
3C 9A2F
输出
A613
说明
key 的长度为 2,data 的长度为 4,因此 key 会被循环使用两次。
第 0 个字符:9 与 3 异或,1001⊕0011=1010,对应 A。
第 1 个字符:A 与 C 异或,1010⊕1100=0110,对应 6。
第 2 个字符:2 与 3 异或,0010⊕0011=0001,对应 1。
第 3 个字符:F 与 C 异或,1111⊕1100=0011,对应 3。
依次拼接得到 A613。
输入
1
B7E 5A
输出
ED
说明
key 的长度为 3,data 的长度为 2。
由于 key 不短于 data,只使用 key 的前两个字符 B 和 7。
第 0 个字符:5 与 B 异或,0101⊕1011=1110,对应 E。
第 1 个字符:A 与 7 异或,1010⊕0111=1101,对应 D。
拼接后结果为 ED。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册