字节跳动2019-8-11笔试
2019-08-11 本文已影响0人
今天不想掉头发
第二题:
小明和小红采用密码加密通信,每次通信有固定的明文长度n和加密次数k。
比如:密码二进制明文是1001010,加密次数是4,则每次将密文右移1位与明文做异或操作,总共位移3次(k=4, 所以k - 1 = 3)
输入:
7 4 // n k
1110100110 //密文输出:
1001010 //明文解释:
1001010
1001010
1001010
1001010
加密次数为4,故对于明文右移4-1=3轮,每轮与当前密文进行一次异或,故1001010对应密文为1110100110
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, k, tmp;
string s, ans = "";
cin >> n >> k;
cin >> s;
ans += s[0];
// 从前往后异或,取前k个数
for (int i = 1; i < k; i++) {
tmp = (int) (s[i] - '0') ^ (int) (s[i - 1] - '0');
ans += tmp + '0';
}
// s[i - 1]是1,2,3,4的异或,而s[i]是2,3,4,5的异或,所以下面的异或式子就是计算第5个数(其中ans[i - k]是第一个数)
for (int i = k; i < n; i++) {
ans += (int) (s[i] - '0') ^ (int) (s[i - 1] - '0') ^ (int) (ans[i - k] - '0') + '0';
}
cout << ans;
return 0;
}