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: Time Limit Exceeded)

using System;
using System.Collections.Generic;
class Program
{
	static void Main(string[] args)
	{
		string A = Console.ReadLine();
		string B = Console.ReadLine();
		string C = Console.ReadLine();
		int min1 = A.Length+B.Length+C.Length;
		for(var i=0;i<6000;i++){
			bool flag = true;
			for(var k=Math.Max(4000,i);k<Math.Min(4000+A.Length,i+B.Length);k++){
				if(A.Substring(k-4000,1)!="?" && B.Substring(k-i,1)!="?" && A.Substring(k-4000,1)!=B.Substring(k-i,1)){
					flag = false;
					break;
				}
			}
			if(flag){
				for(var j=0;j<6000;j++){
					bool flag2 = true;
					for(var k=Math.Max(4000,j);k<Math.Min(4000+A.Length,j+C.Length);k++){
						if(A.Substring(k-4000,1)!="?" && C.Substring(k-j,1)!="?" && A.Substring(k-4000,1)!=C.Substring(k-j,1)){
							flag2 = false;
							break;
						}
					}
					if(flag2){
						for(var k=Math.Max(i,j);k<Math.Min(i+B.Length,j+C.Length);k++){
							if(B.Substring(k-i,1)!="?" && C.Substring(k-j,1)!="?" && B.Substring(k-i,1)!=C.Substring(k-j,1)){
								flag2 = false;
								break;
							}
						}
						if(flag2){
							min1 = Math.Min(min1,Math.Max(Math.Max(4000+A.Length,i+B.Length),j+C.Length) - Math.Min(Math.Min(i,j),4000));
						}
					}
				}
			}
		}
		Console.WriteLine(min1);	
	}
}