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

Solution (Python):
n,a,b,c=map(int,input().split())





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()






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

Solution (Python):
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



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')


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')

Solution (Python):
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
    
    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')

Solution (Python):
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))

Solution (Python):
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))

Solution (Python):
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)

Solution (Python):
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')

Solution (Python):
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)

Solution (Python):
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)

Solution (Python):


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])

Solution (Python):

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])

Solution (Python):
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)

Solution (Python):


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))