Problem:


Score : 600 points

Problem Statement

There is a game that involves three variables, denoted A, B, and C.

As the game progresses, there will be N events where you are asked to make a choice.
Each of these choices is represented by a string s_i. If s_i is AB, you must add 1 to A or B then subtract 1 from the other; if s_i is AC, you must add 1 to A or C then subtract 1 from the other; if s_i is BC, you must add 1 to B or C then subtract 1 from the other.

After each choice, none of A, B, and C should be negative.

Determine whether it is possible to make N choices under this condition. If it is possible, also give one such way to make the choices.

Constraints

1 \leq N \leq 10^5

0 \leq A,B,C \leq 10^9

N, A, B, C are integers.

s_i is AB, AC, or BC.

Input

Input is given from Standard Input in the following format:

N A B C
s_1
s_2
:
s_N

Output

If it is possible to make N choices under the condition, print Yes; otherwise, print No.

Also, in the former case, show one such way to make the choices in the subsequent N lines. The (i+1)-th line should contain the name of the variable (A, B, or C) to which you add 1 in the i-th choice.

Sample Input 1

2 1 3 0
AB
AC

Sample Output 1

Yes
A
C

You can successfully make two choices, as follows:

In the first choice, add 1 to A and subtract 1 from B. A becomes 2, and B becomes 2.

In the second choice, add 1 to C and subtract 1 from A. C becomes 1, and A becomes 1.

Sample Input 2

3 1 0 0
AB
BC
AB

Sample Output 2

No

Sample Input 3

1 0 9 0
AC

Sample Output 3

No

Sample Input 4

8 6 9 1
AC
BC
AB
BC
AC
BC
AB
AB

Sample Output 4

Yes
C
B
B
C
C
B
A
A



Sample input:
2 1 3 0
AB
AC


Sample output:
Yes
A
C

Submission status: Accepted

Solution code:
n,a,b,c=map(int,input().split())
#a+b+c>1のときは必ずYes(追記:入力例3が優しい)
#a+b+c==1のときは操作が限定される
#a+b+c==0のときはNo
#a+b+c>=3のときは大きい方を-1、小さい方を+1の貪欲でいける
#a+b+c=2のときは何手か先まで読む
s=[input()for _ in range(n)]
if s[0]=="AC" and a==c==0:print("No");exit()
if s[0]=="BC" and b==c==0:print("No");exit()
if s[0]=="AB" and a==b==0:print("No");exit()
if (a+b+c)==0:print("No");exit()
if (a+b+c)==1:
  ans=[]
  for i in s:
    if i=="AB":
      if a==1:ans.append("B");a,b=0,1
      elif b==1:ans.append("A");a,b=1,0
      else:print("No");exit()
    elif i=="AC":
      if a==1:ans.append("C");a,c=0,1
      elif c==1:ans.append("A");a,c=1,0
      else:print("No");exit()
    else:
      if b==1:ans.append("C");b,c=0,1
      elif c==1:ans.append("B");b,c=1,0
      else:print("No");exit()
  print("Yes")
  for i in ans:print(i)
  exit()
if (a+b+c)>=3:
  print("Yes")
  for i in s:
    if i=="AB":
      if a>=b:print("B");a-=1;b+=1
      else:print("A");a+=1;b-=1
    elif i=="BC":
      if b>=c:print("C");c+=1;b-=1
      else:print("B");b+=1;c-=1
    else:
      if a>=c:print("C");c+=1;a-=1
      else:print("A");a+=1;c-=1
  exit()
#a+b+c=2
#何手まで読むか
#ダメな操作の例は？
#110AB,020AC
#つまりNoになるのはその直後
#1手先まで読めばいい
print("Yes")
for i in range(n-1):
  if s[i]=="AB":
    if a==b==1:
      if s[i+1]=="AC":print("A");a+=1;b-=1
      else:print("B");b+=1;a-=1
    else:
      if a>=b:print("B");a-=1;b+=1
      else:print("A");a+=1;b-=1
  if s[i]=="BC":
    if b==c==1:
      if s[i+1]=="AB":print("B");b+=1;c-=1
      else:print("C");c+=1;b-=1
    else:
      if b>=c:print("C");c+=1;b-=1
      else:print("B");b+=1;c-=1
  if s[i]=="AC":
    if a==c==1:
      if s[i+1]=="BC":print("C");c+=1;a-=1
      else:print("A");a+=1;c-=1
    else:
      if a>=c:print("C");c+=1;a-=1
      else:print("A");a+=1;c-=1
if s[-1]=="AB":
  if a>=b:print("B");a-=1;b+=1
  else:print("A");a+=1;b-=1
elif s[-1]=="BC":
  if b>=c:print("C");c+=1;b-=1
  else:print("B");b+=1;c-=1
else:
  if a>=c:print("C");c+=1;a-=1
  else:print("A");a+=1;c-=1

Submission status: Accepted

Solution code:
import bisect
import os

import sys

if os.getenv("LOCAL"):
    sys.stdin = open("_in.txt", "r")

sys.setrecursionlimit(10 ** 9)
INF = float("inf")
IINF = 10 ** 18
MOD = 10 ** 9 + 7
# MOD = 998244353


N, A, B, C = list(map(int, sys.stdin.buffer.readline().split()))
S = [sys.stdin.buffer.readline().decode().rstrip() for _ in range(N)]


def get_idx(c):
    ret = []
    for i, s in enumerate(S):
        if c == s:
            ret.append(i)
    ret.append(N)
    return ret


ab_idx = get_idx('AB')
ac_idx = get_idx('AC')
bc_idx = get_idx('BC')

# 0,0 にしなければいい
a, b, c = A, B, C
ans = []
ok = True
for i, s in enumerate(S):
    pa, pb, pc = a, b, c
    if s == 'AB':
        if a == b == 0:
            ok = False
            break
        elif a > b:
            a -= 1
            b += 1
        elif a < b:
            a += 1
            b -= 1
        elif a == b == 1:
            ai = ac_idx[bisect.bisect_left(ac_idx, i)]
            bi = bc_idx[bisect.bisect_left(bc_idx, i)]
            if ai < bi:
                a += 1
                b -= 1
            else:
                a -= 1
                b += 1
        else:
            a -= 1
            b += 1
    if s == 'AC':
        if a == c == 0:
            ok = False
            break
        elif a > c:
            a -= 1
            c += 1
        elif a < c:
            a += 1
            c -= 1
        elif a == c == 1:
            ai = ab_idx[bisect.bisect_left(ab_idx, i)]
            ci = bc_idx[bisect.bisect_left(bc_idx, i)]
            if ai < ci:
                a += 1
                c -= 1
            else:
                a -= 1
                c += 1
        else:
            a -= 1
            c += 1
    if s == 'BC':
        if c == b == 0:
            ok = False
            break
        elif c > b:
            c -= 1
            b += 1
        elif c < b:
            c += 1
            b -= 1
        elif c == b == 1:
            ci = ac_idx[bisect.bisect_left(ac_idx, i)]
            bi = ab_idx[bisect.bisect_left(ab_idx, i)]
            if ci < bi:
                c += 1
                b -= 1
            else:
                c -= 1
                b += 1
        else:
            c -= 1
            b += 1

    if pa < a:
        ans.append('A')
    elif pb < b:
        ans.append('B')
    elif pc < c:
        ans.append('C')
    else:
        assert False
if ok:
    print('Yes')
else:
    print('No')
    exit()
print(*ans, sep='\n')

Submission status: Accepted

Solution code:
import sys

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines

Q, A, B, C = map(int, readline().split())
N = A + B + C
S = read().split()

S = tuple(0 if s == b'BC' else 1 if s == b'AC' else 2 for s in S)

def solve_1(N, A, B, C, S):
    nums = [A, B, C]
    for s in S:
        if nums[s] == N:
            raise Exception
        i, j = (0, 1) if s == 2 else (0, 2) if s == 1 else (1, 2)
        if nums[i] < nums[j]:
            i, j = j, i
        yield j
        nums[j] += 1
        nums[i] -= 1

def solve_2(N, A, B, C, S):
    nums = [A, B, C]
    s = S[0]
    # 初手で死亡
    if nums[s] == N:
        raise Exception
    # あとはできる。きわどいときは 2 手読み
    S = S + (0, )
    for s, t in zip(S, S[1:]):
        i, j = (0, 1) if s == 2 else (0, 2) if s == 1 else (1, 2)
        if (nums[i], nums[j]) != (1, 1):
            if nums[i] < nums[j]:
                i, j = j, i
        elif s != t:
            i, j = t, 3 - s - t
        yield j
        nums[j] += 1
        nums[i] -= 1

def large(N, A, B, C, S):
    nums = [A, B, C]
    for s in S:
        if nums[s] == N:
            raise Exception
        i, j = (0, 1) if s == 2 else (0, 2) if s == 1 else (1, 2)
        if nums[i] < nums[j]:
            i, j = j, i
        yield j
        nums[j] += 1
        nums[i] -= 1

f = solve_1 if N == 1 else solve_2 if N == 2 else large

try:
    cmds = list(f(N, A, B, C, S))
    print('Yes')
    answer = ('ABC' [i] for i in cmds)
    print('\n'.join(answer))
except Exception:
    print('No')

Submission status: Accepted

Solution code:
n, a, b, c = map(int, input().split())
d = {'AB': (0, 1), 'AC': (0, 2), 'BC': (1, 2)}
queries = [d[input()] for _ in range(n)]
history = []
abc = [a, b, c]
for i in range(n):
    x, y = queries[i]
    if abc[x] == 0 and abc[y] == 0:
        print('No')
        exit()
    if abc[x] == 1 and abc[y] == 1:
        if i == n - 1:
            history.append('ABC'[x])
            abc[x] += 1
            abc[y] -= 1
        elif x in queries[i + 1]:
            history.append('ABC'[x])
            abc[x] += 1
            abc[y] -= 1
        else:
            history.append('ABC'[y])
            abc[x] -= 1
            abc[y] += 1
    else:
        if abc[x] > abc[y]:
            history.append('ABC'[y])
            abc[x] -= 1
            abc[y] += 1
        else:
            history.append('ABC'[x])
            abc[x] += 1
            abc[y] -= 1
print('Yes')
print('\n'.join(history))

Submission status: Accepted

Solution code:
n,a,b,c = map(int,input().split())
state = [a,b,c]

def stoi(s):
    if s == "AB":
        return [0,1]
    if s == "AC":
        return [0,2]
    return [1,2]
itos = ["A","B","C"]
s = [stoi(input()) for _ in range(n)]

arr = [""]*n

def sim():
    for idx,select in enumerate(s):
        if state[select[0]] == 0 and state[select[1]] == 0:
            print("No")
            exit()
        if state[select[0]] == 0:
            arr[idx] = itos[select[0]]
            state[select[0]] += 1
            state[select[1]] -= 1
        elif state[select[1]] == 0:
            arr[idx] = itos[select[1]]
            state[select[1]] += 1
            state[select[0]] -= 1
        elif state[select[0]] == 1 and state[select[1]] > 1:
            arr[idx] = itos[select[0]]
            state[select[0]] += 1
            state[select[1]] -= 1
        elif state[select[1]] == 1 and state[select[0]] > 1:
            arr[idx] = itos[select[1]]
            state[select[1]] += 1
            state[select[0]] -= 1
        else:
            if idx == n-1:
                arr[idx] = itos[select[0]]
            else:
                if select[0] in s[idx+1]:
                    arr[idx] = itos[select[0]]
                    state[select[0]] += 1
                    state[select[1]] -= 1
                else:
                    arr[idx] = itos[select[1]]
                    state[select[1]] += 1
                    state[select[0]] -= 1
sim()

print("Yes")
for choice in arr:
    print(choice)

Submission status: Accepted

Solution code:
def solve():
    ans = []
    for x, y in s:
        if(num[x]>num[y]): x, y = y, x
        num[x]+=1
        num[y]-=1
        ans.append(x)
        if num[y]<0: return False
    return ans
from collections import defaultdict
import sys
n, a, b, c = map(int, input().split())
num = defaultdict(int)
s = [input() for _ in range(n)]
num['A'] = a
num['B'] = b
num['C'] = c
id = ['A', 'B', 'C']
id.sort(key = lambda x:num[x])
if a+b+c == 0:
    print('No')
    sys.exit()
elif a+b+c == 1:
    ans = solve()
    if ans: 
        print('Yes')
        print(*ans, sep = '\n')
    else:
        print('No')
elif a+b+c == 2:
    ans = []
    flag = True
    for i, (x, y) in enumerate(s):
        if num[x]>num[y]: x, y = y, x
        if num[x]==num[y] and i < n-1:
            if y == s[i+1][0] or y == s[i+1][1]:
                x, y = y, x
        num[x]+=1
        num[y]-=1
        ans.append(x)
        if num[y]<0:
            flag = False
    if flag:
        print('Yes')
        print(*ans, sep = '\n')
    else:
        print('No')
elif num[id[0]] == 0 and num[id[1]] == 0 and (s[0]==id[0]+id[1] or s[0]==id[1]+id[0]):
    print('No')
else:
    ans = solve()
    print('Yes')
    print(*ans, sep = '\n')

Submission status: Accepted

Solution code:
n, a, b, c = map(int, input().split())
stage = []

for _ in range(n):
    s = input()
    stage.append(s)


var = [a, b, c]

if var.count(0) == 3:
    print('No')
    exit()


d = {"A": 0, "B": 1, "C": 2}
dd = {0: "A", 1: "B", 2: "C"}

ans = []

for i in range(n):
    p = d[stage[i][0]]
    q = d[stage[i][1]]
    r = 3 - p - q
    if var[p] == 0 and var[q] == 0:
        print('No')
        exit()
    elif var[p] == 1 and var[q] == 1 and var[r] == 0:
        if i != n-1:
            pp = d[stage[i+1][0]]
            qq = d[stage[i+1][1]]
            if p not in [pp, qq]:
                var[q] += 1
                var[p] -= 1
                ans.append(dd[q])
            else:
                var[p] += 1
                var[q] -= 1
                ans.append(dd[p])
        else:
            ans.append(dd[p])
    else:
        if var[p] < var[q]:
            var[p] += 1
            var[q] -= 1
            ans.append(dd[p])
        else:
            var[q] += 1
            var[p] -= 1
            ans.append(dd[q])

print('Yes')
for x in ans:
    print(x)

Submission status: Accepted

Solution code:
import sys

sys.setrecursionlimit(10**7)
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
ns = lambda: readline().rstrip()
ni = lambda: int(readline().rstrip())
nm = lambda: map(int, readline().split())
nl = lambda: list(map(int, readline().split()))
printn = lambda x: print('\n'.join(x))

n, a, b, c = nm()
d = {'A': a, 'B':b, 'C':c}
l = [input() for _ in range(n)] + ['#']
ans = list()
for i in range(n):
    u, v = l[i]
    if d[u] <= d[v]:
        u, v = v, u
    if d[u] == d[v] and u in l[i+1]:
        u, v = v, u
    ans.append(v)
    d[u] -= 1
    d[v] += 1
    if d[u] < 0:
        print('No')
        exit(0)
print('Yes')
printn(ans)

Submission status: Accepted

Solution code:
# import sys
# input = sys.stdin.readline
n, a, b, c = map(int,input().split())
S = [input() for i in range(n)]
A = [a,b,c]

D = {"A":0, "B":1, "C":2}
E = ["A","B","C"]
ANS = []
ng = 0

for i in range(n):
    x = D[S[i][0]]
    y = D[S[i][1]]

    if A[x] > A[y]:
        A[x] -= 1
        A[y] += 1
        ANS.append(E[y])
    elif A[y] > A[x]:
        A[y] -= 1
        A[x] += 1
        ANS.append(E[x])
    else:
        if A[x] == 0 and A[y] == 0:
            ng = 1
            break
        elif A[x] == 1 and A[y] == 1 and i != n-1:
            xx = D[S[i+1][0]]
            yy = D[S[i+1][1]]
            if S[i] != S[i+1] and (xx == x or yy == x):
                A[x] += 1
                A[y] -= 1
                ANS.append(E[x])
            else:
                A[y] += 1
                A[x] -= 1
                ANS.append(E[y])
        else:
            A[y] += 1
            A[x] -= 1
            ANS.append(E[y])

if ng == 1:
    print("No")
else:
    print("Yes")
    for i in range(len(ANS)):
        print(ANS[i])

Submission status: Accepted

Solution code:

N,A,B,C = map(int,input().split())

import sys
sys.setrecursionlimit(500000)

s = []

for i in range(N):

    S = input()
    s.append(S)

def dfs(dep,A,B,C):

    if dep == N:
        return []

    if s[dep] == "AB":

        if A == B == 0:
            return None
        if A >= B:
            cat = dfs(dep+1,A-1,B+1,C)
            if cat != None:
                cat.append("B")
                return cat
        if A <= B:
            cat = dfs(dep+1,A+1,B-1,C)
            if cat != None:
                cat.append("A")
                return cat

    elif s[dep] == "BC":
        
        if B == C == 0:
            return None
        if B >= C:
            cat = dfs(dep+1,A,B-1,C+1)
            if cat != None:
                cat.append("C")
                return cat
        if B <= C:
            cat = dfs(dep+1,A,B+1,C-1)
            if cat != None:
                cat.append("B")
                return cat

    else:

        if A == C == 0:
            return None
        if A >= C:
            cat = dfs(dep+1,A-1,B,C+1)
            if cat != None:
                cat.append("C")
                return cat
        if A <= C:
            cat = dfs(dep+1,A+1,B,C-1)
            if cat != None:
                cat.append("A")
                return cat

    return None

       
rev = dfs(0,A,B,C)

if rev == None:
    print ("No")
else:
    print ("Yes")
    for i in range(N-1,-1,-1):
        print (rev[i])

Submission status: Accepted

Solution code:
from random import randint
n, a, b, c = map(int, input().split())
S = []
for i in range(n):
    s = input()
    S.append(s)
ans = []
for i in range(n):
    c0 = S[i]
    if c0 == 'AB':
        if a == b == 0:
            print('No')
            exit(0)
        elif a < b or (a == b and i != n - 1 and 'A' in S[i+1]):
            ans.append('A')
            a += 1
            b -= 1
        else:
            ans.append('B')
            a -= 1
            b += 1
    elif c0 == 'BC':
        if c == b == 0:
            print('No')
            exit(0)
        elif c < b or (c == b and i != n - 1 and 'C' in S[i+1]):
            ans.append('C')
            c += 1
            b -= 1
        else:
            ans.append('B')
            c -= 1
            b += 1
    else:
        if c == a == 0:
            print('No')
            exit(0)
        elif c < a or (c == a and i != n - 1 and 'C' in S[i+1]):
            ans.append('C')
            c += 1
            a -= 1
        else:
            ans.append('A')
            c -= 1
            a += 1
print('Yes')
print('\n'.join(ans))
exit(0)

Submission status: Accepted

Solution code:


from collections import defaultdict
import sys
sys.setrecursionlimit(10**8)
INF = float('inf')
mod = 10**9 + 7
eps = 10**-7


def inp():
    return int(input())


def inpl():
    return list(map(int, input().split()))


N, a, b, c = inpl()
ss = [input() for _ in range(N)] + ["AB"]

abc = [a, b, c]
ans = []
abc_str = ["A", "B", "C"]


def calc(s_ij, ns_ij):
    global ans
    global abc

    (i, j) = s_ij

    if abc[i] == 0 and abc[j] == 0:
        print("No")
        sys.exit()
    elif abc[i] == 0:
        ans.append(abc_str[i])
        abc[i] += 1
        abc[j] -= 1
    elif abc[j] == 0:
        ans.append(abc_str[j])
        abc[j] += 1
        abc[i] -= 1
    elif abc[i] == 1 and abc[j] == 1:
        if i in ns_ij:
            ans.append(abc_str[i])
            abc[i] += 1
            abc[j] -= 1
        else:
            ans.append(abc_str[j])
            abc[j] += 1
            abc[i] -= 1
    else:
        if abc[i] < abc[j]:
            ans.append(abc_str[i])
            abc[i] += 1
            abc[j] -= 1
        else:
            ans.append(abc_str[j])
            abc[i] -= 1
            abc[j] += 1


def conv(s):
    if s == "AB":
        return (0, 1)
    elif s == "BC":
        return (1, 2)
    elif s == "AC":
        return (0, 2)


for i, s in enumerate(ss[:-1]):
    ns = ss[i + 1]

    s_ij = conv(s)
    ns_ij = conv(ns)

    calc(s_ij, ns_ij)

print("Yes")
print("\n".join(ans))

Submission status: Runtime Error

Solution code:
import sys
def input(): return sys.stdin.readline().strip()
def mapint(): return map(int, input().split())
sys.setrecursionlimit(10**9)

N, A, B, C = mapint()
costs = {'A': A, 'B': B, 'C': C}
old_a, old_b = list(input())

if costs[old_a]==0 and costs[old_b]==0:
    print('No')
    exit()
print('Yes')
for _ in range(N-1):
    nx_a, nx_b = list(input())
    if old_a==nx_a or old_a==nx_b:
        print(old_a)
        costs[old_a] += 1
    else:
        print(old_b)
        costs[old_b] += 1
    old_a, old_b = nx_a, nx_b

if not costs[nx_a]:
    print(nx_a)
else:
    print(nx_b)

Submission status: Runtime Error

Solution code:
N,A,B,C = map(int,input().split())
valid = True
array = []
for i in range(N):
    s = input()
    array.append(s)
array2 = []
for i in range(N):
    if array[i] == "AB":
        if A == B == 0:
            valid = False
            break
        elif i != N-1 and A == B and array[i+1] == "AC":
            A += 1
            B -= 1
            array2.append("A")
        elif i != N-1 and A == B and array[i+1] == "BC":
            A -= 1
            B += 1
            array2.append("B")
        elif A <= B:
            A += 1
            B -= 1
            array2.append("A")
        else:
            A -= 1
            B += 1
            array2.append("B")
    elif array[i] == "AC":
        if A == C == 0:
            valid = False
            break
        elif i != N-1 and A == C and array[i+1] == "BC":
            A -= 1
            C += 1
            array2.append("C")
        elif i != N-1 and A == C and array[i+1] == "AC":
            A += 1
            C -= 1
            array2.append("A")
        elif A <= C:
            A += 1
            C -= 1
            array2.append("A")
        else:
            A -= 1
            C += 1
            array2.append("C")
    else:
        if B == C == 0:
            valid = False
            break
        elif i != N-1 and B == C and arrya[i+1] == "AC":
            B -= 1
            C += 1
            array2.append("C")
        elif i != N-1 and B == C and array[i+1] == "AB":
            B += 1
            C -= 1
            array2.append("B")
        elif B <= C:
            B += 1
            C -= 1
            array2.append("B")
        else:
            B -= 1
            C += 1
            array2.append("C")
if valid:
    print("Yes")
    for i in range(len(array2)):
        print(array2[i])
else:
    print("No")

Submission status: Runtime Error

Solution code:
import sys
input = sys.stdin.readline
n, a, b, c = map(int, input().split())
S = [input().rstrip() for _ in range(n)]
D = ["AB", "BC", "CA"]
X = [a+b, b+c, c+a]
L = []
for i, s in enumerate(S):
  if s == "AC":
    s = "CA"
  k = D.index(s)
  if X[k] == 0:
    print("No")
    exit()
  if X[(k+1)%3] == 1 and X[(k+2)%3] == 1 and i < n-1:
    l = D.index(S[i+1])
    if l == (k+1)%3:
      X[(k+1)%3] += 1
      X[(k+2)%3] -= 1
      L.append(s[1])
    else:
      X[(k+2)%3] += 1
      X[(k+1)%3] -= 1
      L.append(s[0])
  else:
    if X[(k+1)%3] < X[(k+2)%3]:
      X[(k+1)%3] += 1
      X[(k+2)%3] -= 1
      L.append(s[1])
    else:
      X[(k+2)%3] += 1
      X[(k+1)%3] -= 1
      L.append(s[0])
print("Yes")
print(*L, sep="\n")

Submission status: Runtime Error

Solution code:
n, a, b, c = (int(x) for x in input().split())
d = {"A": a, "B": b, "C": c}
S = [input() for _ in range(n)]
ANS = []

for i, s in enumerate(S):
    if d[s[0]] == 0 and d[s[1]] == 0:
        print("No")
        exit()
    else:
        if d[s[0]] > d[s[1]] or (d[s[0]] == d[s[1]] == 1 and i < n and s[1] in S[i + 1]):
            d[s[1]] += 1
            d[s[0]] -= 1
            ANS.append(s[1])
        else:
            d[s[0]] += 1
            d[s[1]] -= 1
            ANS.append(s[0])
print("Yes")
for ans in ANS:
    print(ans)

Submission status: Runtime Error

Solution code:
n,a,b,c=map(int,input().split())
s=[input()for _ in range(n)]
if (a+b+c)==0:
  print("No")
if (a+b+c)==1 or (a+b+c)>=3:
  ans=[]
  for i in s:
    if i=="AB":
      if a<b:ans.append("A");a+=1;b+=-1;c+=0
      else:ans.append("B");a+=-1;b+=1;c+=0
    if i=="BC":
      if b<c:ans.append("B");a+=0;b+=1;c+=-1
      else:ans.append("C");a+=0;b+=-1;c+=1
    if i=="AC":
      if a<c:ans.append("A");a+=1;b+=0;c+=-1
      else:ans.append("C");a+=-1;b+=0;c+=1
    if min(a,b,c)<0:
      exit(print("No"))
  print("Yes")
  for i in ans:print(i)
if (a+b+c)==2:
  ans=[]
  for i in range(n-1):
    if s[i]=="AB":
      if a==b:
        if s[i+1]=="AC":ans.append("A");a+=1;b+=-1;c+=0
        else:ans.append("B");a+=-1;b+=1;c+=0
      elif a<b:ans.append("A");a+=1;b+=-1;c+=0
      else:ans.append("B");a+=-1;b+=1;c+=0
    if s[i]=="BC":
      if b==c:
        if s[i+1]=="AC":ans.append("C");a+=0;b+=-1;c+=1
        else:ans.append("B");a+=0;b+=1;c+=-1
      elif b<c:ans.append("B");a+=0;b+=1;c+=-1
      else:ans.append("C");a+=0;b+=-1;c+=1
    if s[i]=="AC":
      if a==c:
        if s[i+1]=="BC":ans.append("C");a+=-1;b+=0;c+=1
        else:ans.append("A");a+=1;b+=0;c+=-1
      elif a<c:ans.append("A");a+=1;b+=0;c+=-1
      else:ans.append("C");a+=-1;b+=0;c+=1
      if min(a,b,c)<0:
      exit(print("No"))
  for i in s[n-1:]:
    if i=="AB":
      if a<b:ans.append("A");a+=1;b+=-1;c+=0
      else:ans.append("B");a+=-1;b+=1;c+=0
    if i=="BC":
      if b<c:ans.append("B");a+=0;b+=1;c+=-1
      else:ans.append("C");a+=0;b+=-1;c+=1
    if i=="AC":
      if a<c:ans.append("A");a+=1;b+=0;c+=-1
      else:ans.append("C");a+=-1;b+=0;c+=1
    if min(a,b,c)<0:
      exit(print("No"))
  print("Yes")
  for i in ans:print(i)

Submission status: Runtime Error

Solution code:
def main():
    import sys

    def input(): return sys.stdin.readline().rstrip()

    def stoidx(s):
        if s == 'AB':
            return (0, 1)
        elif s == 'BC':
            return (1, 2)
        else:
            return (0, 2)


    def answer(ans):
        print('Yes')
        for a in ans:
            print(a)

    def add_answer(x):
        if s[x[0]] > s[x[1]]:
            s[x[0]] -= 1
            s[x[1]] += 1
            ans.append(abc[x[1]])
        else:
            s[x[0]] += 1
            s[x[1]] -= 1
            ans.append(abc[x[0]])
        
    n, *s = map(int, input().split())
    sl = []
    for i in range(n):
        sl.append(stoidx(input()))
    abc = 'ABC'
    ans = []
    if sum(s) == 0:
        print('No')
        return

    elif sum(s) == 1:
        for x in sl:
            if s[x[0]] == 0 and s[x[1]] == 0:
                print('No')
                return
            add_answer(x)

    else:
        for i, x in enumerate(sl):
            if s[x[0]] == 0 and s[x[1]] == 0:
                print('No')
                return
                
            if i < n-1 and s[x[0]] == 1 and s[x[1]] == 1:
                nx = sl[i+1]
                if x != nx and sum(s)==2:
                    if x[0] in nx:
                        s[x[0]] += 1
                        s[x[1]] -= 1
                        ans.append(abc(x[0]))
                    else:
                        s[x[0]] -= 1
                        s[x[1]] += 1
                        ans.append(abc(x[1]))
                else:
                    add_answer(x)
            else:
                add_answer(x)
    answer(ans)


if __name__ == '__main__':
    main()

Submission status: Runtime Error

Solution code:
def main():
    import sys

    def input(): return sys.stdin.readline().rstrip()

    def stoidx(s):
        if s == 'AB':
            return (0, 1)
        elif s == 'BC':
            return (1, 2)
        else:
            return (0, 2)


    def answer(ans):
        print('Yes')
        for a in ans:
            print(a)

    def add_answer(x):
        if s[x[0]] > s[x[1]]:
            s[x[0]] -= 1
            s[x[1]] += 1
            ans.append(abc[x[1]])
        else:
            s[x[0]] += 1
            s[x[1]] -= 1
            ans.append(abc[x[0]])
        
    n, *s = map(int, input().split())
    sl = []
    for i in range(n):
        sl.append(stoidx(input()))
    abc = 'ABC'
    ans = []
    if sum(s) == 0:
        print('No')
        return

    elif sum(s) == 1:
        for x in sl:
            if s[x[0]] == 0 and s[x[1]] == 0:
                print('No')
                return
            add_answer(x)

    else:
        for i, x in enumerate(sl):
            if s[x[0]] == 0 and s[x[1]] == 0:
                print('No')
                return
                
            if i < n-1 and s[x[0]] == 1 and s[x[1]] == 1:
                nx = sl[i+1]
                if x != nx and sum(s)==2:
                    if x[0] in nx:
                        s[x[0]] += 1
                        s[x[1]] -= 1
                        ans.append(abc(x[0]))
                    else:
                        s[x[0]] -= 1
                        s[x[1]] += 1
                        ans.append(abc(x[1]))
            else:
                add_answer(x)
    answer(ans)


if __name__ == '__main__':
    main()

Submission status: Runtime Error

Solution code:
def main():
    import sys

    def input(): return sys.stdin.readline().rstrip()

    def stoidx(s):
        if s == 'AB':
            return (0, 1)
        elif s == 'BC':
            return (1, 2)
        else:
            return (0, 2)


    def answer(ans):
        print('Yes')
        for a in ans:
            print(a)

    def add_answer(x):
        if s[x[0]] > s[x[1]]:
            s[x[0]] -= 1
            s[x[1]] += 1
            ans.append(abc[x[1]])
        else:
            s[x[0]] += 1
            s[x[1]] -= 1
            ans.append(abc[x[0]])
        
    n, *s = map(int, input().split())
    sl = []
    for i in range(n):
        sl.append(stoidx(input()))
    abc = 'ABC'
    ans = []
    if sum(s) == 0:
        print('No')
        return

    elif sum(s) == 1:
        for x in sl:
            if s[x[0]] == 0 and s[x[1]] == 0:
                print('No')
                return
            add_answer(x)

    else:
        for i, x in enumerate(sl):
            if s[x[0]] == 0 and s[x[1]] == 0:
                print('No')
                return
                
            if i < n-1 and s[x[0]] == 1 and s[x[1]] == 1:
                nx = sl[i+1]
                if x != nx and sum(s)==2:
                    if x[0] in nx:
                        s[x[0]] += 1
                        s[x[1]] -= 1
                        ans.append(abc(x[0]))
                    else:
                        s[x[0]] -= 1
                        s[x[1]] += 1
                        ans.append(abc(x[1]))
            else:
                add_answer(x)


if __name__ == '__main__':
    main()

Submission status: Runtime Error

Solution code:
def main():
    import sys

    def input(): return sys.stdin.readline().rstrip()

    def stoidx(s):
        if s == 'AB':
            return (0, 1)
        elif s == 'BC':
            return (1, 2)
        else:
            return (0, 2)


    def answer(ans):
        print('Yes')
        for a in ans:
            print(a)

    def add_answer(x):
        if s[x[0]] > s[x[1]]:
            s[x[0]] -= 1
            s[x[1]] += 1
            ans.append(abc[x[1]])
        else:
            s[x[0]] += 1
            s[x[1]] -= 1
            ans.append(abc(x[0]))
        
    n, *s = map(int, input().split())
    sl = []
    for i in range(n):
        sl.append(stoidx(input()))
    abc = 'ABC'
    ans = []
    if sum(s) == 0:
        print('No')
        return

    elif sum(s) == 1:
        for x in sl:
            if s[x[0]] == 0 and s[x[1]] == 0:
                print('No')
                return
            add_answer(x)

    else:
        for i, x in enumerate(sl):
            if s[x[0]] == 0 and s[x[1]] == 0:
                print('No')
                return
                
            if i < n-1 and s[x[0]] == 1 and s[x[1]] == 1:
                nx = sl[i+1]
                if x != nx and sum(s)==2:
                    if x[0] in nx:
                        s[x[0]] += 1
                        s[x[1]] -= 1
                        ans.append(abc(x[0]))
                    else:
                        s[x[0]] -= 1
                        s[x[1]] += 1
                        ans.append(abc(x[1]))
            else:
                add_answer(x)


if __name__ == '__main__':
    main()