算法101---反异或(字节跳动)

一、题目:

二、思路:反异或

若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)
        
原文地址:https://www.cnblogs.com/Lee-yl/p/11336558.html