#include <bits/stdc++.h>   using namespace std;   using ll = long long;   using pi = pair<long long, long long>;   const int N = 1e5 + 5;   const long long p1 = 31;   const long long p2 = 41;   const long long mod1 = 1e9 + 7;   const long long mod2 = 1e9 + 9;   long long power1[N];   long long power2[N];   long long prefix1[3][N];   long long prefix2[3][N];   pi suff[3][N];   string s[3];   int arr[3] = {0, 1, 2};   bool yes[3][3];   long long mod_exp(long long x, long long y, long long mod) {     long long res = 1;     x %= mod;     while (y > 0) {       if (y & 1LL) {         res = (res * x) % mod;       }       y >>= 1LL;       x = (x * x) % mod;     }     return res;   }   ll inv(ll x, ll mod) { return mod_exp(x, mod - 2, mod); }   ll add(ll a, ll b, ll mod) { return (a + b) % mod; }   ll mul(ll a, ll b, ll mod) { return (a * b) % mod; }   ll sub(ll a, ll b, ll mod) { return (a - b + mod) % mod; }   pi see(int l, int r, int idx) {     pi p;     if (l > 0) {       p.first = mul(sub(prefix1[idx][r], prefix1[idx][l - 1], mod1),                     inv(power1[l], mod1), mod1);       p.second = mul(sub(prefix2[idx][r], prefix2[idx][l - 1], mod2),                      inv(power2[l], mod2), mod2);     } else {       p.first = prefix1[idx][r];       p.second = prefix2[idx][r];     }     return p;   }   inline void compute(string &str, int idx) {     prefix1[idx][0] = str[0];     prefix2[idx][0] = str[0];     int n = str.size();     for (int i = 1; i < n; ++i) {       prefix1[idx][i] =           add(prefix1[idx][i - 1], mul(str[i], power1[i], mod1), mod1);       prefix2[idx][i] =           add(prefix2[idx][i - 1], mul(str[i], power2[i], mod2), mod2);     }     for (int i = n - 1; i >= 0; --i) {       suff[idx][i] = see(i, n - 1, idx);     }     sort(suff[idx], suff[idx] + n);   }   bool check(int idx1, int idx2) {     if (s[idx2].size() < s[idx1].size()) {       return 0;     }     int i = 0;     int j = s[idx1].size() - 1;     int k = s[idx1].size() - 1;     while (j < s[idx2].size()) {       if (see(i, j, idx2) == pi(prefix1[idx1][k], prefix2[idx1][k])) {         return 1;       }       ++i;       ++j;     }     return 0;   }   inline int solve() {     int ret = s[arr[0]].size();     for (int i = 1; i < 3; ++i) {       if (yes[arr[i]][arr[i - 1]]) {         continue;       }       if (i == 2 && yes[arr[i]][arr[i - 2]]) {         break;       }       int sub = 0;       for (int j = s[arr[i]].size() - 1; j >= 0; --j) {         if (binary_search(suff[arr[i - 1]],                           suff[arr[i - 1]] + s[arr[i - 1]].size(),                           pi(prefix1[arr[i]][j], prefix2[arr[i]][j]))) {           sub = j + 1;           break;         }       }       ret += s[arr[i]].size() - sub;     }     return ret;   }   int main() {     ios_base::sync_with_stdio(0);     power1[0] = 1;     power2[0] = 1;     for (int i = 1; i < N; ++i) {       power1[i] = mul(power1[i - 1], p1, mod1);       power2[i] = mul(power2[i - 1], p2, mod2);     }     for (int i = 0; i < 3; ++i) {       cin >> s[i];       compute(s[i], i);     }     for (int i = 0; i < 3; ++i) {       for (int j = 0; j < 3; ++j) {         if (i == j) {           continue;         }         yes[i][j] = check(i, j);       }     }     int res = 1 << 29;     do {       res = min(res, solve());     } while (next_permutation(arr, arr + 3));     cout << res <<   n ;     return 0;   }