一、题目:
二、思路:反异或
若a^b=c
则a=b^c
如:N = 7,K= 4,s = 1110100110【原来序列为1001010】
则:
1 2 3 4 4 4 4 3 2 1 【一共10个数】这个列表代表异或次数。
1 0 0 1 0 1 0
1 0 0 1 0 1 0
1 0 0 1 0 1 0
1 0 0 1 0 1 0
---------------------------
新建两个列表,一个A,B,A表示B有没有更新过,B表示原来的列表。
A = 【False】* N,B= 【0】 * N
上面标红的序列可以进行以下操作:
B[i] = int(s[i]) ^ int(s[i-1])
B[N - i - 1] = int(s[N+K-i-2]) ^ int(s[N+K-i-1])
标黄的可以进行以下操作:
B[minnum + j] = B[minnum + j -1] ^ int(s[minnum + j])
通过这两个操作来更新B。最后返回B。
三、代码:
N , K = map(int,input().split()) s = input() def solve(s,N,K): if K == 0: print(s) return if N == 1: print(s[0]) return if N > 1 : A , B = [False] * N , [0] * N A[0] , A[N-1] , B[0] , B[N-1] = True , True, int(s[0]) , int(s[N+K-2]) minnum = min(N,K) for i in range(1,minnum): if not A[i]: B[i] = int(s[i]) ^ int(s[i-1]) A[i] = True if not A[N - i - 1] and i != minnum: B[N - i - 1] = int(s[N+K-i-2]) ^ int(s[N+K-i-1]) A[N - i - 1] = True for j in range(N+K-2*minnum): if minnum + j -1 < N and not A[minnum + j -1]: B[minnum + j] = B[minnum + j -1] ^ int(s[minnum + j]) res = "" for i in range(N): res += str(B[i]) print(res) return solve(s,N,K)