Problem:
Score : 500 points

Problem Statement

Snuke has a string s.
From this string, Anuke, Bnuke, and Cnuke obtained strings a, b, and c, respectively, as follows:

Choose a non-empty (contiguous) substring of s (possibly s itself). Then, replace some characters (possibly all or none) in it with ?s.

For example, if s is mississippi, we can choose the substring ssissip and replace its 1-st and 3-rd characters with ? to obtain ?s?ssip.

You are given the strings a, b, and c.
Find the minimum possible length of s.

Constraints

1 \leq |a|, |b|, |c| \leq 2000

a, b, and c consists of lowercase English letters and ?s.

Input

Input is given from Standard Input in the following format:

a
b
c

Output

Print the minimum possible length of s.

Sample Input 1

a?c
der
cod

Sample Output 1

7

For example, s could be atcoder.

Sample Input 2

atcoder
atcoder
???????

Sample Output 2

7

a, b, and c may not be distinct.

Solution in C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using static System.Math;
using MethodImplAttribute = System.Runtime.CompilerServices.MethodImplAttribute;
using MethodImplOptions = System.Runtime.CompilerServices.MethodImplOptions;

public static class P
{
    public static void Main()
    {
        var a = Console.ReadLine();
        var b = Console.ReadLine();
        var c = Console.ReadLine();
        var cands = new[]
        {
            Solve(Solve(a, b), c),
            Solve(Solve(a, c), b),
            Solve(Solve(b, a), c),
            Solve(Solve(b, c), a),
            Solve(Solve(c, a), b),
            Solve(Solve(c, b), a),
            Solve(c, Solve(a, b)),
            Solve(b, Solve(a, c)),
            Solve(c, Solve(b, a)),
            Solve(a, Solve(b, c)),
            Solve(b, Solve(c, a)),
            Solve(a, Solve(c, b)),
        };
        Console.WriteLine(cands.Min(x => x.Length));
    }
    static string Solve(string a, string b)
    {
        for (int i = 0; i < a.Length; i++)
        {
            for (int j = i, k = 0; j < a.Length && k < b.Length; j++, k++)
            {
                if (a[j] == '?' || b[k] == '?' || a[j] == b[k]) continue;
                goto end;
            }
            StringBuilder builder = new StringBuilder();
            for (int j = 0; j < i; j++) builder.Append(a[j]);
            for (int j = i, k = 0; j < a.Length || k < b.Length; j++, k++)
            {
                if (j < a.Length && a[j] != '?') builder.Append(a[j]);
                else if (k < b.Length && b[k] != '?') builder.Append(b[k]);
                else builder.Append('?');
            }
            return builder.ToString();
            end:;
        }
        return a + b;
    }
}