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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

	public static String[] abc = new String[3];

	public static String Check(String a, String b) {
		String ret = "";
		for(int i = 0; i < Math.min(a.length(), b.length()); i++) {
			if(b.charAt(i) == '?') {
				ret += a.charAt(i);
			} else if(a.charAt(i) == '?' || a.charAt(i) == b.charAt(i)) {
				ret += b.charAt(i);
			} else {
				ret = "!";
				return ret;
			}
		}
		if(a.length() > b.length()) {
			ret += a.substring(b.length());
		} else if(b.length() > a.length()) {
			ret += b.substring(a.length());
		}
		return ret;
	}

	public static int Match() {
		String ans = abc[0];
		for(int j = 1; j < 3; j++) {
			for(int i = 0; i < ans.length() + 1; i++) {
				if(i == ans.length()) {
					ans += abc[j];
					break;
				} else {
					String ret = Check(ans.substring(i), abc[j]);
					if(ret.equals("!"))
						continue;
					else {
						ans = ans.substring(0, i) + ret;
						break;
					}
				}
			}
		}
		return ans.length();
	}

	public static int Calc(List<String> list, int num) {
		if(list.isEmpty()) {
			return Match();
		} else {
			int ans = 10000;
			for(int i = 0; i < 3 - num; i++) {
				abc[num] = list.get(i);
				List<String> ret = new ArrayList<>(list);
				ret.remove(i);
				ans = Math.min(ans, Calc(ret, num + 1));
			}
			return ans;
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String a = sc.next();
		String b = sc.next();
		String c = sc.next();
		List<String> list = new ArrayList<>();
		list.add(a);
		list.add(b);
		list.add(c);
		int ans = Calc(list, 0);
		System.out.println(ans);

	}

}