//Code by Patcas Csaba #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LL long long #define PII pair #define VB vector #define VI vector #define VD vector #define VS vector #define VPII vector > #define VVI vector < VI > #define VVB vector < VB > #define FORN(i, n) for(int i = 0; i < (n); ++i) #define FOR(i, a, b) for(int i = (a); i <= (b); ++i) #define FORD(i, a, b) for(int i = (a); i >= (b); --i) #define FORI(it, X) for(__typeof((X).begin()) it = (X).begin(); it !=(X).end(); ++it) #define REPEAT do{ #define UNTIL(x) }while(!(x)); #define SZ size() #define BG begin() #define EN end() #define CL clear() #define X first #define Y second #define RS resize #define PB push_back #define MP make_pair #define ALL(x) x.begin(), x.end() #define IN_FILE "a.in" #define OUT_FILE "a.out" int n = 0; VS a; map > pos; string sol; bool found(string s) { int curPos = -1; FORN(i, s.SZ) { if (!pos.count(s[i])) return false; set::iterator it = pos[s[i]].lower_bound(curPos); if (it!=pos[s[i]].EN) curPos = *it; } return true; } int main() { //Read data //freopen(IN_FILE, "r", stdin); //freopen(OUT_FILE, "w", stdout); //Solve string s; a.PB("dummy"); while (cin >> s) { ++n; a.PB(s); } string bestSol = ""; FOR(i, 1, 10) { sol = a[1]; FORN(i, sol.SZ) { pos[sol[i]].insert(i); } FOR(i, 2, n) { if (found(a[i])) continue; FORN(j, a[i].SZ) { pos[a[i][j]].insert(sol.SZ + j); } sol = sol + a[i]; } if (bestSol.SZ == 0 || bestSol.SZ > sol.SZ) bestSol = sol; pos.clear(); sol = ""; random_shuffle(a.BG + 1, a.EN); } //Write data cout << bestSol << endl; return 0; }