#include #include #include using namespace std; #define REP(i,a) for (int i = 0; i < (a); i++) #define FOR(i,a,b) for (int i = (a); i <= (b); i++) #define ROF(i,a,b) for (int i = (a); i >= (b); i--) #define SZ(x) (int)(x).size() #define pb push_back const int Nmax = 105; const int Mod2 = 1000000009; const int Mod1 = 1000000007; bool dp[Nmax]; string word[Nmax]; int h1[Nmax][Nmax]; int h2[Nmax][Nmax]; int H1[Nmax]; int H2[Nmax]; int main() { ios_base::sync_with_stdio(false); int n; cin >> n; FOR(i,0,n-1) { cin >> word[i]; FOR(j,0,SZ(word[i])-1) { H1[i] = 1LL * H1[i] * 26 % Mod1 + word[i][j] - 'a'; H2[i] = 1LL * H2[i] * 26 % Mod2 + word[i][j] - 'a'; if (H1[i] >= Mod1) H1[i] -= Mod1; if (H2[i] >= Mod2) H2[i] -= Mod2; } } int best = -1; FOR(i,0,n-1) { REP(j,SZ(word[i])) dp[j] = 0; REP(from,SZ(word[i])) { h1[from][from] = word[i][from] - 'a'; h2[from][from] = h1[from][from]; FOR(to,from+1,SZ(word[i])-1) { h1[from][to] = 1LL * h1[from][to-1] * 26 % Mod1 + word[i][to] - 'a'; h2[from][to] = 1LL * h2[from][to-1] * 26 % Mod2 + word[i][to] - 'a'; if (h1[from][to] >= Mod1) h1[from][to] -= Mod1; if (h2[from][to] >= Mod2) h2[from][to] -= Mod2; } } REP(j,SZ(word[i])) { REP(k,n) if (k != i && SZ(word[k]) <= j + 1) { int len = SZ(word[k]); if (H1[k] == h1[j-len+1][j] && H2[k] == h2[j-len+1][j] && (j-len+1 == 0 || dp[j-len])) { dp[j] = 1; break; } } } if (dp[SZ(word[i])-1] && (best == -1 || SZ(word[i]) > SZ(word[best]))) best = i; } if (best == -1) cout << -1; else cout << word[best]; }