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>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define all(v) v.begin(), v.end()
typedef long long ll;
typedef pair<ll,ll> P;
typedef vector<ll> vec;
typedef vector<vec> mat;
string a[3];
vec A[3][3];
int main(){
    rep(i,3) cin>>a[i];
    rep(i,3)rep(j,3){
        if(i==j) continue;
        rep(k,a[i].size()){
            int z=1;
            rep(l,a[i].size()-k) if(a[i][l+k]!=a[j][l]&&a[i][l+k]!='?'&&a[j][l]!='?') z=0;
            A[i][j].push_back(z);
        }
    }
    int ans=a[0].size()+a[1].size()+a[2].size();
    vec B={0,1,2};
    do{
        rep(i,a[B[0]].size())rep(j,a[B[1]].size()){
            if(A[B[0]][B[1]][i]&&A[B[1]][B[2]][j]&&(i+j>=a[B[0]].size()||A[B[0]][B[1]][i+j])) ans=min(ans,int(max({a[B[0]].size(),i+a[B[1]].size(),i+j+a[B[2]].size()})));
        }
    }while(next_permutation(all(B)));
    cout<<ans<<"\n";
}