从 CF25E 来的,TLE 了
//2022tysc0819
#include<bits/stdc++.h>
//#include<bits/extc++.h>
using namespace std;
//using namespace __gnu_pbds;
//#define arr array<int,3>
//#define int long long
//#define pb push_back
//#define double long double
//#define map unordered_map
//#pragma GCC optimize(2,3,"Ofast","inline")
const int N=2e6+10,M=1<<3+1,P=1e9+7,MOD=998244353;
const double PI=3.1415926,EPS=0.00001;
int n,nxt[N][26],fail[N],ed[N],rt,cnt,loa[M*N],trc;
int dp[N];
char res[M*N];
bool vis[N][M];
void insert(string s,int id){
int p=rt;
for(auto v:s){
if(!nxt[p][v-'a'])nxt[p][v-'a']=++cnt;
p=nxt[p][v-'a'];
}
dp[p]|=(1<<id-1);
ed[p]++;
}
queue<int>q;
queue<pair<int,int> >qq;
void getf(){
for(int i=0;i<26;i++)if(nxt[rt][i])q.push(nxt[rt][i]);
while(q.size()){
int f=q.front();q.pop();
for(int i=0;i<26;i++){
int p=nxt[f][i];
if(!p)nxt[f][i]=nxt[fail[f]][i];
else{
fail[p]=nxt[fail[f]][i];
dp[p]|=dp[nxt[fail[f]][i]];
q.push(p);
}
}
}
}
string s[N],ans;
signed main(){
while(cin>>s[1]){
for(int i=0;i<=cnt;i++){
fail[i]=dp[i]=0;
for(int j=0;j<8;j++)vis[i][j]=0;
for(int j=0;j<26;j++)nxt[i][j]=0;
}
n=3;
insert(s[1],1);
for(int i=2;i<=n;i++){
cin>>s[i];
insert(s[i],i);
}
getf();
while(qq.size())qq.pop();
qq.push({0,0});
int p=0;trc=0;
vis[0][0]=1;
while(qq.size()){
pair<int,int>f=qq.front();qq.pop();
if(f.second==(1<<n)-1){
ans="";
while(p){
ans+=res[p];
p=loa[p];
}
reverse(ans.begin(),ans.end());
cout<<ans.size()<<"\n";
goto nxt;
}
for(int i=0;i<26;i++)if(
!vis[nxt[f.first][i]]
[f.second|dp[nxt[f.first][i]]]
){
vis[nxt[f.first][i]]
[f.second|dp[nxt[f.first][i]]]=1;
qq.push({
nxt[f.first][i],
f.second|dp[nxt[f.first][i]]
});
++trc;
loa[trc]=p;
res[trc]=char(i+'a');
}
++p;
}
nxt:;
}
return 0;
}
//note: