ABC344 python Atcoderの記録

問題はこちら
4完

A
様々な解法が回答に乗っていて面白い。|で3分割し、1・3番目のみ出力 or |の間を正規表現で置換する方法が早そうな気がした。

S = input()
l = []
for i in range(len(S)):
    if S[i] == "|":
        l.append(i)
print(S[:l[0]] + S[l[1]+1:])


B

l = []
while True:
    A = int(input())
    l.append(A)
    if A == 0:
        break
for i in l[::-1]:
    print(i)


C
有り得る和を先に計算しておけばよい。ただ計算量の概算をミスって無駄に二分探索を書いてしまった。

N = int(input())
A = list(map(int, input().split()))
M = int(input())
B = list(map(int, input().split()))
L = int(input())
C = list(map(int, input().split()))
Q = int(input())
X = list(map(int, input().split()))
# ありうる和を先に計算し、Set型で保持する
set_sum = set()
for a in A:
    for b in B:
        for c  in C:
            set_sum.add(a+b+c)
list_sum = sorted(list(set_sum))
# print(list_sum)
# 二分探索で、xがlist_sum内にあるかを確認する。(この問題では不要らしい)
def serch_from_list(x, list_sum):
    L = 0
    R = len(list_sum)-1
    while R-L > 0:
        M = (L+R)//2
        if list_sum[M] < x:
            L = M+1
        else:
            R = M
    return L
#
for x in X:
    if list_sum[serch_from_list(x, list_sum)] == x:
        print("Yes")
    else:
        print("No")


D
BFS(幅優占探索)かと思って解いていたが、よく考えてみたら計算量が間に合わないため絶対違う。要反省。





E
ある要素の前後が何かを辞書で保持しておく。

N = int(input())
A = ["s"] + list(map(int, input().split())) + ["g"]
Q = int(input())
dict_ascending = {}
dict_descending = {}
for i in range(N+1):
    a,b = [A[i],  A[i+1]]
    dict_ascending[a] = b
    dict_descending[b] = a
# print(dict_ascending)
# print(dict_descending)
#
for _ in range(Q):
    q = list(map(int, input().split()))
    if q[0] == 1:
        x,y = q[1:]
        z = dict_ascending[x]
        dict_ascending[x] = y
        dict_ascending[y] = z
        dict_descending[z] = y
        dict_descending[y] = x
    else:
        x = q[1]
        y = dict_ascending[x]
        w = dict_descending[x]
        dict_ascending[w] = y
        dict_descending[y] = w
#
# print(dict_ascending)
result = ["s"]
while result[-1] != "g":
    result.append(dict_ascending[result[-1]])
print(*result[1:-1])


F