我遇到了这个问题,其中所有程序都只给出了一条逻辑。以下问题的缺失行可以填写什么?
问题陈述
杰克和丹尼尔是朋友。他们想加密他们的谈话,这样他们就可以避免被侦探机构拦截。所以他们发明了一种新的密码。每条消息都被编码为其长度为N的二进制表示B。然后将其写下K次,移位0,1,...,K-1位。如果B=1001010和K=4它看起来像:
1001010
1001010
1001010
1001010
然后计算每一列的异或并写下来。这个数字称为S。例如,对上面示例中的数字进行异或运算会导致
1110100110
然后将编码后的消息S和K发送给 Daniel。
Jack 正在使用这种编码算法,并要求 Daniel 实现解码算法。你能帮助丹尼尔实现这个吗?
输入格式
- 第一行包含两个整数N和K。
- 第二行包含长度为N+K-1的字符串S ,由 1 和 0 组成。
输出格式
长度为N的解码消息,由 1 和 0 组成。
约束
- 1≤N≤10^6,
- 1≤K≤10^6
- |S|=N+K−1
- 保证S是正确的。
样本输入#00
7 4
1110100110
样本输出#00
1001010
样本输入#01
6 2
1110001
样本输出#01
101111
输入#00 的说明
1001010
1001010
1001010
1001010
----------
1110100110
输入#01 的解释
101111
101111
-------
1110001
import java.io.*;
public class Solution {
public static void solve(Input in, PrintWriter out) throws IOException {
int n = in.nextInt();
int k = in.nextInt();
char[] c = in.next().toCharArray();
int x = 0;
char[] ans = new char[n];
for (int i = 0; i < n; ++i) {
ans[i] = (char) (((c[i] - '0') ^ x) + '0');// I understand we are converting the character into integer (c[i] - '0') then xoring it with x which is holding 0 and then again adding '0' to convert back it into character.
x ^= ans[i] - '0';// But why are we doing this!!. From this line onward things are not clear.
if (i >= k - 1) {
****FILL THE MISSING LINE HERE****
}
}
out.println(ans);
}
public static void main(String[] args) throws IOException {
PrintWriter out = new PrintWriter(System.out);
solve(new Input(new BufferedReader(new InputStreamReader(System.in))), out);
out.close();
}
static class Input {
BufferedReader in;
StringBuilder sb = new StringBuilder();
public Input(BufferedReader in) {
this.in = in;
}
public Input(String s) {
this.in = new BufferedReader(new StringReader(s));
}
public String next() throws IOException {
sb.setLength(0);
while (true) {
int c = in.read();
if (c == -1) {
return null;
}
if (" \n\r\t".indexOf(c) == -1) {
sb.append((char)c);
break;
}
}
while (true) {
int c = in.read();
if (c == -1 || " \n\r\t".indexOf(c) != -1) {
break;
}
sb.append((char)c);
}
return sb.toString();
}
public int nextInt() throws IOException {
return Integer.parseInt(next());
}
public long nextLong() throws IOException {
return Long.parseLong(next());
}
public double nextDouble() throws IOException {
return Double.parseDouble(next());
}
}
}