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 Kotlin (1.0.0) (judge verdict: Wrong Answer)

import java.util.Scanner

fun main(args: Array<String>) {
	val scn = Scanner(System.`in`)
	val ss = Array(3){scn.next()}
	val l = Array(3){ i -> IntArray(3){ j ->
		if (i==j) 0 else sharedLen(ss[i], ss[j])
	}}
	val sum = ss.sumBy { it.length }
	var ans = sum
	for (i in 0..2){
		val uu = mutableListOf(0,1,2)
		uu.removeAt(i)
		ans = Math.min(ans, sum - l[i][uu[0]] - l[uu[0]][uu[1]])
		ans = Math.min(ans, sum - l[i][uu[1]] - l[uu[1]][uu[0]])
	}
	println(ans)
}

fun sharedLen(a: String, b: String): Int{
	for (i in Math.min(a.length, b.length) downTo 1){
		if (shared(a,b,i)) return i
	}
	return 0
}

fun shared(a: String, b: String, n: Int): Boolean {
	for (i in 0 until n) {
		val ca = a[a.lastIndex-i]
		val cb = b[i]
		if (ca=='?' || cb=='?') continue
		if (ca!=cb) return false
	}
	return true
}