Problem p02631 (python)

Fixed submission:
import numpy as np
import math
import collections
import bisect
import itertools
from collections import Counter

suf_xor_dict = {}
pre_xor_dict = {}


def suf_xor(N, p):
    # print(p)
    global xor_dict
    if N - len(p) + 1 in suf_xor_dict:
        return suf_xor_dict[N - len(p) + 1]

    if len(p) == 0:
        return 0
    if len(p) == 1:
        suf_xor_dict[N] = p[0]
        return p[0]
    if len(p) == 2:
        suf_xor_dict[N] = p[1]
        suf_xor_dict[N - 1] = p[0] ^ p[1]
        return(p[0] ^ p[1])
    else:
        ret = p[0] ^ suf_xor(N, p[1:])
        suf_xor_dict[N - len(p) + 1] = ret
        return ret


def pre_xor(N, p):
    global pre_xor_dict
    if len(p) in pre_xor_dict:
        return pre_xor_dict[len(p)]

    if len(p) == 0:
        return 0
    if len(p) == 1:
        pre_xor_dict[1] = p[0]
        return p[0]
    if len(p) == 2:
        pre_xor_dict[1] = p[0]
        pre_xor_dict[2] = p[0] ^ p[1]
        return(p[0] ^ p[1])
    else:
        ret = p[-1] ^ pre_xor(N, p[:-1])
        pre_xor_dict[len(p)] = ret
        return ret


def main():
    N = int(input())
    a = list(map(int, input().split()))
    ans = []
    pre_xor_list = [0]
    suf_xor_list = [0]
    for i in range(N):
        pre_xor_list.append(pre_xor_list[i] ^ a[i])
        suf_xor_list.append(suf_xor_list[i] ^ a[N - i - 1])

    pre_xor_list = pre_xor_list[1:]
    suf_xor_list = suf_xor_list[1:]

    for i in range(N):
        ans.append((0 if i - 1 < 0 else pre_xor_list[i - 1]) ^ (0 if i >= N - 1 else suf_xor_list[N - i - 2]))

    for item in ans:
        print(item, end=' ')
    print('')


if __name__ == "__main__":
    main()

Buggy submission (verdict: Runtime Error):
import numpy as np
import math
import collections
import bisect
import itertools
from collections import Counter

suf_xor_dict = {}
pre_xor_dict = {}


def suf_xor(N, p):
    # print(p)
    global xor_dict
    if N - len(p) + 1 in suf_xor_dict:
        return suf_xor_dict[N - len(p) + 1]

    if len(p) == 0:
        return 0
    if len(p) == 1:
        suf_xor_dict[N] = p[0]
        return p[0]
    if len(p) == 2:
        suf_xor_dict[N] = p[1]
        suf_xor_dict[N - 1] = p[0] ^ p[1]
        return(p[0] ^ p[1])
    else:
        ret = p[0] ^ suf_xor(N, p[1:])
        suf_xor_dict[N - len(p) + 1] = ret
        return ret


def pre_xor(N, p):
    global pre_xor_dict
    if len(p) in pre_xor_dict:
        return pre_xor_dict[len(p)]

    if len(p) == 0:
        return 0
    if len(p) == 1:
        pre_xor_dict[1] = p[0]
        return p[0]
    if len(p) == 2:
        pre_xor_dict[1] = p[0]
        pre_xor_dict[2] = p[0] ^ p[1]
        return(p[0] ^ p[1])
    else:
        ret = p[-1] ^ pre_xor(N, p[:-1])
        pre_xor_dict[len(p)] = ret
        return ret


def main():
    N = int(input())
    a = list(map(int, input().split()))
    ans = []
    last = pre_xor(N, a[:N - 1]) ^ suf_xor(N, a[N:])
    for i in range(N - 1):
        ans.append(pre_xor(N, a[:i]) ^ suf_xor(N, a[i + 1:]))

    ans.append(last)
    for item in ans:
        print(item, end=' ')
    print('')


if __name__ == "__main__":
    main()

Buggy submission (verdict: Runtime Error):
import numpy as np
import math
import collections
import bisect
import itertools
from collections import Counter

suf_xor_dict = {}
pre_xor_dict = {}


def suf_xor(N, p):
    # print(p)
    global xor_dict
    if N - len(p) + 1 in suf_xor_dict:
        # print("memo")
        return suf_xor_dict[N - len(p) + 1]
    if len(p) == 0:
        return 0
    if len(p) == 1:
        return p[0]
    if len(p) == 2:
        suf_xor_dict[N - 1] = p[0] ^ p[1]
        return(p[0] ^ p[1])
    else:
        ret = p[0] ^ suf_xor(N, p[1:])
        suf_xor_dict[N - len(p) + 1] = ret
        return ret


def pre_xor(N, p):
    global pre_xor_dict
    if N - len(p) + 1 in pre_xor_dict:
        # print("memo")
        return pre_xor_dict[N - len(p) + 1]
    if len(p) == 0:
        return 0
    if len(p) == 1:
        return p[0]
    if len(p) == 2:
        pre_xor_dict[N - 1] = p[0] ^ p[1]
        return(p[0] ^ p[1])
    else:
        ret = p[-1] ^ pre_xor(N, p[:-1])
        pre_xor_dict[N - len(p) + 1] = ret
        return ret


def main():
    N = int(input())
    a = list(map(int, input().split()))
    ans = []
    last = pre_xor(N, a[:N - 1]) ^ suf_xor(N, a[N:])
    for i in range(N - 1):
        ans.append(pre_xor(N, a[:i]) ^ suf_xor(N, a[i + 1:]))

    ans.append(last)
    for item in ans:
        print(item, end=' ')
    print('')


if __name__ == "__main__":
    main()

Buggy submission (verdict: Runtime Error):
import numpy as np
import math
import collections
import bisect
import itertools
from collections import Counter

suf_xor_dict = {}
pre_xor_dict = {}


def suf_xor(N, p):
    # print(p)
    global xor_dict
    if N - len(p) + 1 in suf_xor_dict:
        # print("memo")
        return suf_xor_dict[N - len(p) + 1]
    if len(p) == 0:
        return 0
    if len(p) == 1:
        return p[0]
    if len(p) == 2:
        suf_xor_dict[N - 1] = p[0] ^ p[1]
        return(p[0] ^ p[1])
    else:
        ret = p[0] ^ suf_xor(N, p[1:])
        suf_xor_dict[N - len(p) + 1] = ret
        return ret


def pre_xor(N, p):
    global pre_xor_dict
    if N - len(p) + 1 in pre_xor_dict:
        # print("memo")
        return pre_xor_dict[N - len(p) + 1]
    if len(p) == 0:
        return 0
    if len(p) == 1:
        return p[0]
    if len(p) == 2:
        pre_xor_dict[N - 1] = p[0] ^ p[1]
        return(p[0] ^ p[1])
    else:
        ret = p[-1] ^ pre_xor(N, p[:-1])
        pre_xor_dict[N - len(p) + 1] = ret
        return ret


def main():
    N = int(input())
    a = list(map(int, input().split()))
    ans = []
    for i in range(N):
        ans.append(pre_xor(N, a[:i]) ^ suf_xor(N, a[i + 1:]))
    for item in ans:
        print(item, end=' ')
    print('')


if __name__ == "__main__":
    main()