Problem p02692 (python)

Fixed submission:
import sys
if sys.subversion[0] == "PyPy":
    import io, atexit
    sys.stdout = io.BytesIO()
    atexit.register(lambda: sys.__stdout__.write(sys.stdout.getvalue()))
    
    sys.stdin = io.BytesIO(sys.stdin.read())
    input = lambda: sys.stdin.readline().rstrip()

n, a, b, c = map(int, raw_input().split())
cmds = []

def getidx(c):
    return 'ABC'.index(c)

g = [ [], [], [] ]
for i in xrange(n):
    s = raw_input()
    cmds.append(s)
    g[getidx(s[0])].append(i)
    g[getidx(s[1])].append(i)

def getnext(c, idx):
    v = g[getidx(c)]
    l, r = 0, len(v) - 1
    while l <= r:
        m = (l + r) / 2
        if v[m] <= idx:
            l = m + 1
        else:
            r = m - 1
    if l >= len(v):
        return n
    return v[l]

cnt = [a, b, c]
res = []


for i in xrange(n):
    cmd = cmds[i]
    p1 = ord(cmd[0]) - ord('A')
    p2 = ord(cmd[1]) - ord('A')

    if cnt[p1] > 1 or cnt[p2] > 1 or cnt[p1] == 0 or cnt[p2] == 0:
        if cnt[p1] > cnt[p2]:
            res.append(cmd[1])
            cnt[p1] -= 1
            cnt[p2] += 1
        else:
            res.append(cmd[0])
            cnt[p1] += 1
            cnt[p2] -= 1
        if min(cnt) < 0:
            res = []
            break
    elif i == n - 1:
        res.append(cmd[0])
        cnt[p1] += 1
        cnt[p2] -= 1
    else:
        # print cnt, p1, p2
        assert cnt[p1] == 1 and cnt[p2] == 1
        assert i + 1 < n

        nxt = cmds[i + 1]
        idx1 = getnext(cmd[0], i)
        idx2 = getnext(cmd[1], i)
        assert min(idx1, idx2) > i

        if idx1 < idx2:
            res.append(cmd[0])
            cnt[p1] += 1
            cnt[p2] -= 1
        else:
            res.append(cmd[1])
            cnt[p1] -= 1
            cnt[p2] += 1
    assert min(cnt) >= 0

if not res:
    print 'No'
else:
    print 'Yes'
    print '\n'.join(res)

Buggy submission (verdict: Runtime Error):
import sys
if sys.subversion[0] == "PyPy":
    import io, atexit
    sys.stdout = io.BytesIO()
    atexit.register(lambda: sys.__stdout__.write(sys.stdout.getvalue()))
    
    sys.stdin = io.BytesIO(sys.stdin.read())
    input = lambda: sys.stdin.readline().rstrip()

n, a, b, c = map(int, raw_input().split())
cmds = []

def getidx(c):
    return 'ABC'.index(c)

g = [ [], [], [] ]
for i in xrange(n):
    s = raw_input()
    cmds.append(s)
    g[getidx(s[0])].append(i)
    g[getidx(s[1])].append(i)

def getnext(c, idx):
    v = g[getidx(c)]
    l, r = 0, len(v) - 1
    while l <= r:
        m = (l + r) / 2
        if v[m] < idx:
            l = m + 1
        else:
            r = m - 1
    if l >= len(v):
        return n
    return v[l]

cnt = [a, b, c]
res = []


for i in xrange(n):
    cmd = cmds[i]
    p1 = ord(cmd[0]) - ord('A')
    p2 = ord(cmd[1]) - ord('A')

    if cnt[p1] > 1 or cnt[p2] > 1 or cnt[p1] == 0 or cnt[p2] == 0:
        if cnt[p1] > cnt[p2]:
            res.append(cmd[1])
            cnt[p1] -= 1
            cnt[p2] += 1
        else:
            res.append(cmd[0])
            cnt[p1] += 1
            cnt[p2] -= 1
        if min(cnt) < 0:
            res = []
            break
    elif i == n - 1:
        res.append(cmd[0])
        cnt[p1] += 1
        cnt[p2] -= 1
    else:
        # print cnt, p1, p2
        assert cnt[p1] == 1 and cnt[p2] == 1
        assert i + 1 < n

        nxt = cmds[i + 1]
        idx1 = getnext(cmd[0], i)
        idx2 = getnext(cmd[1], i)
        assert min(idx1, idx2) > i

        if idx1 < idx2:
            res.append(cmd[0])
            cnt[p1] += 1
            cnt[p2] -= 1
        else:
            res.append(cmd[1])
            cnt[p1] -= 1
            cnt[p2] += 1
    assert min(cnt) >= 0

if not res:
    print 'No'
else:
    print 'Yes'
    print '\n'.join(res)

Buggy submission (verdict: Runtime Error):
import sys
if sys.subversion[0] == "PyPy":
    import io, atexit
    sys.stdout = io.BytesIO()
    atexit.register(lambda: sys.__stdout__.write(sys.stdout.getvalue()))
    
    sys.stdin = io.BytesIO(sys.stdin.read())
    input = lambda: sys.stdin.readline().rstrip()

n, a, b, c = map(int, raw_input().split())
cmds = []

for i in xrange(n):
    s = raw_input()
    cmds.append(s)

cnt = [a, b, c]
res = []

for i in xrange(n):
    cmd = cmds[i]
    p1 = ord(cmd[0]) - ord('A')
    p2 = ord(cmd[1]) - ord('A')

    if cnt[p1] > 1 or cnt[p2] > 1 or cnt[p1] == 0 or cnt[p2]] == 0:
        if cnt[p1] > cnt[p2]:
            res.append(cmd[1])
            cnt[p1] -= 1
            cnt[p2] += 1
        else:
            res.append(cmd[0])
            cnt[p1] += 1
            cnt[p2] -= 1
    elif i == n - 1:
        res.append(cmd[0])
        cnt[p1] += 1
        cnt[p2] -= 1
    else:
        # print cnt, p1, p2
        # assert cnt[p1] == 1 and cnt[p2] == 1
        assert i + 1 < n

        nxt = cmds[i + 1]
        if cmd == nxt:
            res.append(cmd[0])
            cnt[p1] += 1
            cnt[p2] -= 1
        else:
            for c in 'ABC':
                if c in cmd and c in nxt:
                    break
            else:
                assert False

            res.append(c)
            if c == cmd[0]:
                res.append(cmd[0])
                cnt[p1] += 1
                cnt[p2] -= 1
            else:
                res.append(cmd[1])
                cnt[p1] -= 1
                cnt[p2] += 1
    if min(cnt) < 0:
        res = []
        break

if not res:
    print 'No'
else:
    print 'Yes'
    print '\n'.join(res)

Buggy submission (verdict: Runtime Error):
import sys
if sys.subversion[0] == "PyPy":
    import io, atexit
    sys.stdout = io.BytesIO()
    atexit.register(lambda: sys.__stdout__.write(sys.stdout.getvalue()))
    
    sys.stdin = io.BytesIO(sys.stdin.read())
    input = lambda: sys.stdin.readline().rstrip()

n, a, b, c = map(int, raw_input().split())
cmds = []

for i in xrange(n):
    s = raw_input()
    cmds.append(s)

cnt = [a, b, c]
res = []

for i in xrange(n):
    cmd = cmds[i]
    p1 = ord(cmd[0]) - ord('A')
    p2 = ord(cmd[1]) - ord('A')

    if cnt[p1] > 1 or cnt[p2] > 1:
        if cnt[p1] > cnt[p2]:
            res.append(cmd[1])
            cnt[p1] -= 1
            cnt[p2] += 1
        else:
            res.append(cmd[0])
            cnt[p1] += 1
            cnt[p2] -= 1
    elif cnt[p1] == 0 and cnt[p2] == 0:
        res = []
        break
    elif i == n - 1:
        res.append(cmd[0])
        cnt[p1] += 1
        cnt[p2] -= 1
    else:
        # print cnt, p1, p2
        assert cnt[p1] == 1 and cnt[p2] == 1
        assert i + 1 < n

        nxt = cmds[i + 1]
        if cmd == nxt:
            res.append(cmd[0])
            cnt[p1] += 1
            cnt[p2] -= 1
        else:
            for c in 'ABC':
                if c in cmd and c in nxt:
                    break
            else:
                assert False

            res.append(c)
            if c == cmd[0]:
                res.append(cmd[0])
                cnt[p1] += 1
                cnt[p2] -= 1
            else:
                res.append(cmd[1])
                cnt[p1] -= 1
                cnt[p2] += 1
    assert min(cnt) >= 0


if not res:
    print 'No'
else:
    print 'Yes'
    print '\n'.join(res)

Buggy submission (verdict: Runtime Error):
import sys
if sys.subversion[0] == "PyPy":
    import io, atexit
    sys.stdout = io.BytesIO()
    atexit.register(lambda: sys.__stdout__.write(sys.stdout.getvalue()))
    
    sys.stdin = io.BytesIO(sys.stdin.read())
    input = lambda: sys.stdin.readline().rstrip()

n, a, b, c = map(int, raw_input().split())
cmds = []

for i in xrange(n):
    s = raw_input()
    cmds.append(s)

cnt = [a, b, c]
res = []

for i in xrange(n):
    cmd = cmds[i]
    p1 = ord(cmd[0]) - ord('A')
    p2 = ord(cmd[1]) - ord('A')

    if cnt[p1] > 1 and cnt[p2] > 1:
        if cnt[p1] > cnt[p2]:
            res.append(cmd[1])
            cnt[p1] -= 1
            cnt[p2] += 1
        else:
            res.append(cmd[0])
            cnt[p1] += 1
            cnt[p2] -= 1
    elif cnt[p1] == 0 and cnt[p2] == 0:
        res = []
        break
    elif cnt[p1] == 1 and cnt[p2] == 0:
        res.append(cmd[1])
        cnt[p1] -= 1
        cnt[p2] += 1
    elif cnt[p1] == 0 and cnt[p2] == 1:
        res.append(cmd[0])
        cnt[p1] += 1
        cnt[p2] -= 1
    elif i == n - 1:
        assert cnt[p1] == 1 and cnt[p2] == 1
        res.append(cmd[0])
        cnt[p1] += 1
        cnt[p2] -= 1
    else:
        assert cnt[p1] == 1 and cnt[p2] == 1
        assert i + 1 < n

        nxt = cmds[i + 1]
        p3 = ord(nxt[0]) - ord('A')
        p4 = ord(nxt[1]) - ord('A')

        if p3 in [p1, p2] and cnt[p4] == 0:
            if p3 == p1:
                res.append(cmd[0])
                cnt[p1] += 1
                cnt[p2] -= 1
            else:
                res.append(cmd[1])
                cnt[p1] -= 1
                cnt[p2] += 1
        else:
            res.append(cmd[0])
            cnt[p1] += 1
            cnt[p2] -= 1


if not res:
    print 'No'
else:
    print 'Yes'
    print '\n'.join(res)

Buggy submission (verdict: Runtime Error):
import sys
if sys.subversion[0] == "PyPy":
    import io, atexit
    sys.stdout = io.BytesIO()
    atexit.register(lambda: sys.__stdout__.write(sys.stdout.getvalue()))
    
    sys.stdin = io.BytesIO(sys.stdin.read())
    input = lambda: sys.stdin.readline().rstrip()

n, a, b, c = map(int, raw_input().split())
cmds = []

a_ = a
b_ = b
c_ = c

def print_res(cnts, res):
    rem = [a_, b_, c_]
    p = [0, 0, 0]
    for i in xrange(3):
        p[i] = cnts[i] + res[i]
        assert p[i] % 2 == 0
        p[i] /= 2

    print 'Yes'
    for s in cmds:
        nr = {
            'AB': 0,
            'AC': 1,
            'BC': 2
        }[s]

        x, y = ord(s[0]) - ord('A'), ord(s[1]) - ord('A')

        if p[nr] > 0:
            p[nr] -= 1
            print s[0]
            rem[x] += 1
            rem[y] -= 1
        else:
            print s[1]
            rem[y] += 1
            rem[x] -= 1

    assert min(rem) >= 0


cnts = [0, 0, 0]

for i in xrange(n):
    s = raw_input()
    cmds.append(s)

    nr = {
        'AB': 0,
        'AC': 1,
        'BC': 2
    }[s]

    cnts[nr] += 1


for i in xrange(-cnts[0], cnts[0] + 1, 2):
    aa = a + i
    bb = b - i
    cc = c

    res = [i, -1, -1]

    delta = cnts[1]
    da = (delta - aa + 1) / 2
    dc = delta - da
    res[1] = da - dc
    assert da + dc == delta
    aa = aa + da - dc
    cc = cc + dc - da

    delta = cnts[2]
    db = (delta - bb + 1) / 2
    dc = delta - db
    assert db + dc == delta
    bb = bb + db - dc
    cc = cc + dc - db
    res[2] = db - dc

    if aa >= 0 and bb >= 0 and cc >= 0:
        print_res(cnts, res)
        break
else:
    print 'No'