思路:数据量很小直接暴力枚举24种拼接方法,每种拼接方法合并时用相关的find函数找最长的公共前后缀即可,另外注意 size_t 和 int 比较的坑

/*find是找子字符串出现的首个位置,rfind是找子字符串出现的最后一个位置
find_first_of是找子字符串中任意一个字符出现的首个位置,find_last_of是找子字符串中任意一个字符出现的末尾位置
由长到短暴力枚举最长公共前后缀即可
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

string s[4];

int a[24][4] = {
    {0, 1, 2, 3},
    {0, 1, 3, 2},
    {0, 2, 1, 3},
    {0, 2, 3, 1},
    {0, 3, 1, 2},
    {0, 3, 2, 1},
    {1, 0, 2, 3},
    {1, 0, 3, 2},
    {1, 2, 0, 3},
    {1, 2, 3, 0},
    {1, 3, 0, 2},
    {1, 3, 2, 0},
    {2, 0, 1, 3},
    {2, 0, 3, 1},
    {2, 1, 0, 3},
    {2, 1, 3, 0},
    {2, 3, 0, 1},
    {2, 3, 1, 0},
    {3, 0, 1, 2},
    {3, 0, 2, 1},
    {3, 1, 0, 2},
    {3, 1, 2, 0},
    {3, 2, 0, 1},
    {3, 2, 1, 0},
};

int unite() {
    int ans = 40;
    for (int i = 0; i < 24; ++i) {
        string t = s[a[i][0]];
        for (int j = 1; j < 4; ++j) {
            string nex = s[a[i][j]];
            //cout << t << ' ' << nex << endl;
            if (t.find(nex) != string::npos)
                continue;
            else {
                int pos = 0;
                int len = min((int)t.size(), (int)nex.size());
                for (int k = len; k >= 1; --k) {
                    string temp = nex.substr(0, k);
                    if (t.rfind(temp) == t.size() - k) {
                        pos = k;
                        break;
                    }
                }
                t += nex.substr(pos);
            }
        }
        // cout << t.size() << endl;
        ans = min(ans, (int)t.size());
    }
    return ans;
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(0);
    for (int i = 0; i < 4; ++i)
        cin >> s[i];
    cout << unite() << endl;
    system("pause");
    return 0;
}