Problem p02745 (Python) — buggy submission, verdict: Time Limit Exceeded

"""
検証: https://twitter.com/neterukun_cd/status/1283020759942619139
"""
MAX_N = 2000
a = [ord(char) for char in input()]
b = [ord(char) for char in input()]
c = [ord(char) for char in input()]

len_a = len(a)
len_b = len(b)
len_c = len(c)

a += [63] * (MAX_N - len_a + 10)
b += [63] * (MAX_N - len_b + 10)
c += [63] * (MAX_N - len_c + 10)

ab = [True] * (2 * MAX_N + 10)
ba = [True] * (2 * MAX_N + 10)
bc = [True] * (2 * MAX_N + 10)
cb = [True] * (2 * MAX_N + 10)
ca = [True] * (2 * MAX_N + 10)
ac = [True] * (2 * MAX_N + 10)

for length in range(MAX_N + 1):
    for i in range(MAX_N + 1):
        if i + length > MAX_N:
            break

        if a[i + length] != b[i] and a[i + length] != 63 and b[i] != 63:
            ab[length] = False
        if b[i + length] != a[i] and b[i + length] != 63 and a[i] != 63:
            ba[length] = False

        if b[i + length] != c[i] and b[i + length] != 63 and c[i] != 63:
            bc[length] = False
        if c[i + length] != b[i] and c[i + length] != 63 and b[i] != 63:
            cb[length] = False

        if c[i + length] != a[i] and c[i + length] != 63 and a[i] != 63:
            ca[length] = False
        if a[i + length] != c[i] and a[i + length] != 63 and c[i] != 63:
            ac[length] = False

ans = MAX_N * 6
"""
# AC
for len1 in range(MAX_N + 1):
    for len2 in range(MAX_N + 1):
        if ab[len1] and bc[len2] and ac[len1 + len2]:
            tmp = max(len_a, len_b + len1, len_c + len1 + len2)
            ans = min(ans, tmp)
        if ba[len1] and ac[len2] and bc[len1 + len2]:
            tmp = max(len_b, len_a + len1, len_c + len1 + len2)
            ans = min(ans, tmp)

for len1 in range(MAX_N + 1):
    for len2 in range(MAX_N + 1):
        if bc[len1] and ca[len2] and ba[len1 + len2]:
            tmp = max(len_b, len_c + len1, len_a + len1 + len2)
            ans = min(ans, tmp)
        if cb[len1] and ba[len2] and ca[len1 + len2]:
            tmp = max(len_c, len_b + len1, len_a + len1 + len2)
            ans = min(ans, tmp)

for len1 in range(MAX_N + 1):
    for len2 in range(MAX_N + 1):
        if ca[len1] and ab[len2] and cb[len1 + len2]:
            tmp = max(len_c, len_a + len1, len_b + len1 + len2)
            ans = min(ans, tmp)
        if ac[len1] and cb[len2] and ab[len1 + len2]:
            tmp = max(len_a, len_c + len1, len_b + len1 + len2)
            ans = min(ans, tmp)
"""
# TLE?
for len1 in range(MAX_N + 1):
    for len2 in range(MAX_N + 1):
        if ab[len1] and bc[len2] and ac[len1 + len2]:
            tmp = max(len_a, len_b + len1, len_c + len1 + len2)
            ans = min(ans, tmp)
        if ba[len1] and ac[len2] and bc[len1 + len2]:
            tmp = max(len_b, len_a + len1, len_c + len1 + len2)
            ans = min(ans, tmp)

        if bc[len1] and ca[len2] and ba[len1 + len2]:
            tmp = max(len_b, len_c + len1, len_a + len1 + len2)
            ans = min(ans, tmp)
        if cb[len1] and ba[len2] and ca[len1 + len2]:
            tmp = max(len_c, len_b + len1, len_a + len1 + len2)
            ans = min(ans, tmp)

for len1 in range(MAX_N + 1):
    for len2 in range(MAX_N + 1):
        if ca[len1] and ab[len2] and cb[len1 + len2]:
            tmp = max(len_c, len_a + len1, len_b + len1 + len2)
            ans = min(ans, tmp)
        if ac[len1] and cb[len2] and ab[len1 + len2]:
            tmp = max(len_a, len_c + len1, len_b + len1 + len2)
            ans = min(ans, tmp)

print(ans)


Error: TLE

Fixed submission:

"""
検証: https://twitter.com/neterukun_cd/status/1283020759942619139
"""


def main():
    MAX_N = 2000
    a = [ord(char) for char in input()]
    b = [ord(char) for char in input()]
    c = [ord(char) for char in input()]

    len_a = len(a)
    len_b = len(b)
    len_c = len(c)

    a += [63] * (MAX_N - len_a + 10)
    b += [63] * (MAX_N - len_b + 10)
    c += [63] * (MAX_N - len_c + 10)

    ab = [True] * (2 * MAX_N + 10)
    ba = [True] * (2 * MAX_N + 10)
    bc = [True] * (2 * MAX_N + 10)
    cb = [True] * (2 * MAX_N + 10)
    ca = [True] * (2 * MAX_N + 10)
    ac = [True] * (2 * MAX_N + 10)

    for length in range(MAX_N + 1):
        for i in range(MAX_N + 1):
            if i + length > MAX_N:
                break

            if a[i + length] != b[i] and a[i + length] != 63 and b[i] != 63:
                ab[length] = False
            if b[i + length] != a[i] and b[i + length] != 63 and a[i] != 63:
                ba[length] = False

            if b[i + length] != c[i] and b[i + length] != 63 and c[i] != 63:
                bc[length] = False
            if c[i + length] != b[i] and c[i + length] != 63 and b[i] != 63:
                cb[length] = False

            if c[i + length] != a[i] and c[i + length] != 63 and a[i] != 63:
                ca[length] = False
            if a[i + length] != c[i] and a[i + length] != 63 and c[i] != 63:
                ac[length] = False

    ans = MAX_N * 6
    """
    # AC
    for len1 in range(MAX_N + 1):
        for len2 in range(MAX_N + 1):
            if ab[len1] and bc[len2] and ac[len1 + len2]:
                tmp = max(len_a, len_b + len1, len_c + len1 + len2)
                ans = min(ans, tmp)
            if ba[len1] and ac[len2] and bc[len1 + len2]:
                tmp = max(len_b, len_a + len1, len_c + len1 + len2)
                ans = min(ans, tmp)

    for len1 in range(MAX_N + 1):
        for len2 in range(MAX_N + 1):
            if bc[len1] and ca[len2] and ba[len1 + len2]:
                tmp = max(len_b, len_c + len1, len_a + len1 + len2)
                ans = min(ans, tmp)
            if cb[len1] and ba[len2] and ca[len1 + len2]:
                tmp = max(len_c, len_b + len1, len_a + len1 + len2)
                ans = min(ans, tmp)

    for len1 in range(MAX_N + 1):
        for len2 in range(MAX_N + 1):
            if ca[len1] and ab[len2] and cb[len1 + len2]:
                tmp = max(len_c, len_a + len1, len_b + len1 + len2)
                ans = min(ans, tmp)
            if ac[len1] and cb[len2] and ab[len1 + len2]:
                tmp = max(len_a, len_c + len1, len_b + len1 + len2)
                ans = min(ans, tmp)
    """
    # TLE?
    for len1 in range(MAX_N + 1):
        for len2 in range(MAX_N + 1):
            if ab[len1] and bc[len2] and ac[len1 + len2]:
                tmp = max(len_a, len_b + len1, len_c + len1 + len2)
                ans = min(ans, tmp)
            if ba[len1] and ac[len2] and bc[len1 + len2]:
                tmp = max(len_b, len_a + len1, len_c + len1 + len2)
                ans = min(ans, tmp)

            if bc[len1] and ca[len2] and ba[len1 + len2]:
                tmp = max(len_b, len_c + len1, len_a + len1 + len2)
                ans = min(ans, tmp)
            if cb[len1] and ba[len2] and ca[len1 + len2]:
                tmp = max(len_c, len_b + len1, len_a + len1 + len2)
                ans = min(ans, tmp)

            if ca[len1] and ab[len2] and cb[len1 + len2]:
                tmp = max(len_c, len_a + len1, len_b + len1 + len2)
                ans = min(ans, tmp)
            if ac[len1] and cb[len2] and ab[len1 + len2]:
                tmp = max(len_a, len_c + len1, len_b + len1 + len2)
                ans = min(ans, tmp)

    print(ans)


if __name__ == "__main__":
    main()