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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=(a);i<=(b);++i)
#define rv(i,a,b) for(int i=(a);i>=(b);++i)
#define pb(x) push_back(x)
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(),x.end()
using namespace std;
typedef long long LL;
const int M = 1200000;
const int inf = 0x3f3f3f3f;
string a[4];
string con(string s,string t){
	int n=SZ(s);
	int m=SZ(t);
	fo(i,0,n-1){
		int x=i,y=0;
		while(x<n&&y<m){
			if(s[x]==t[y] || s[x]=='?' || t[y]=='?'){
				++x;
				++y;
			}
			else break;
		}
		if(x==n||y==m){
			if(n-i>=m) return s;
			string ret=s+t.substr(n-i);
			return ret;
		}
	}
	return s+t;
}
int main() {
	cin>>a[0]>>a[1]>>a[2];
	int b[3]={0,1,2};
	string ans=a[0]+a[1]+a[2];
	do{
		string ret=con(a[b[0]],a[b[1]]);
		ret=con(ret,a[b[2]]);
		if(SZ(ret)<SZ(ans)) ans=ret;
	}while(next_permutation(b,b+3));
	cout<<SZ(ans)<<endl;
	return 0;
}