1 #include<stdio.h>
 2 #include<string.h>
 3 #define maxn 101000
 4 int v[maxn];//字符串长度为n,将字符串中的字符对应的数字(最小的字母是1,以此类推)存在里面且r[n]=0
 5 int wa[maxn], wb[maxn], wv[maxn], ws[maxn];//获取sa的辅助数组
 6 int sa[maxn];//后缀数组,后缀按照字典序从小到大排列,结果存在sa[1]到sa[n],值为后缀编号
 7 int cmp(int *r, int a, int b, int l)
 8 {return r[a] == r[b] && r[a +l ] == r[b + l];}
 9 void makesa(int n, int m) {
10  int i, j, p, *x = wa, *y = wb, *t;
11  for(i = 0; i < m; ++i) ws[i] = 0;
12  for(i = 0; i < n; ++i) ++ws[x[i] = v[i]];
13  for(i = 1; i < m; ++i) ws[i] += ws[i - 1];
14  for(i = n-1; i >= 0; --i) sa[--ws[x[i]]] = i;
15  for(j = 1,p = 1; p < n; j *= 2, m = p) {
16   for(p = 0, i = n - j; i < n; ++i) y[p++] = i;
17   for(i = 0; i < n; ++i) if(sa[i] >= j) y[p++] = sa[i]-j;
18   for(i = 0; i < n; ++i) wv[i] = x[y[i]];
19   for(i = 0; i < m; ++i) ws[i] = 0;
20   for(i = 0; i < n; ++i) ws[wv[i]]++;
21   for(i = 1; i < m; ++i) ws[i] += ws[i - 1];
22   for(i = n - 1; i >= 0; --i) sa[--ws[wv[i]]] = y[i];
23   for(t = x, x = y, y = t, p = 1, x[sa[0]] = 0, i = 1; i < n; i++)
24    x[sa[i]] = cmp(y, sa[i - 1], sa[i], j) ? p - 1 : p++;
25  }
26  return;
27 }
28 int rank[maxn]; //名次数组 代表后缀i在sa中的下标
29 int height[maxn];//最长公共前缀长度 height[i] = lcp(sa[i], sa[i-1]);
30 void getHeight(int n) {
31 int i, j, k = 0;
32 for(i = 1; i <= n; ++i) rank[sa[i]] = i;
33 for(i = 0; i < n; height[rank[i++]] = k)
34 for(k? k-- : 0, j = sa[rank[i] - 1]; v[i + k] == v[j + k]; ++k);
35 return;
36 }
37 int ans[maxn];
38 int main() {
39     int n, tot, l, r, num[maxn], flag[110], anst, kase = 0;
40     char s[1010];
41     while(scanf("%d", &n), n) {
42         r = tot = -1;
43         for(int i = 1; i <= n; ++i) {
44             scanf("%s", s);
45             int len = strlen(s);
46             if(len > r)  r = len;
47             for(int j = 0; s[j]; ++j) {
48                 v[++tot] = s[j] - 'a' + 1;
49                 num[tot] = i;
50             }
51             v[++tot] = 26 + i;
52         }
53         v[++tot] = 0;
54         makesa(tot + 1, 26 + n + 1);
55         getHeight(tot);
56         l = 1;
57         height[++tot] = -1;
58         while(l <= r) {
59             int flag1 = 0;
60             int mid = (l + r)/ 2;
61             memset(flag, 0, sizeof(flag));
62             for(int i = 2; i <= tot; ++i) {
63                 if(height[i] >= mid) {
64                     flag[num[sa[i]]] = flag[num[sa[i - 1]]] = 1;
65                 }
66                 else {
67                     int num1 = 0;
68                     for(int j = 1; j <= n; ++j) if(flag[j]) ++num1;
69                     if(num1 > n / 2) {
70                         if(!flag1) anst= -1;
71                         ans[++anst] = sa[i - 1];
72                         flag1 = 1;
73                     }
74                     memset(flag, 0, sizeof(flag));
75                 }
76             }
77             if(flag1) l = mid + 1;
78             else r = mid - 1;
79         }
80         if(kase) printf("\n");
81         if(r == 0) printf("?\n");
82         else {
83             for(int i = 0; i <= anst; ++i) {
84                 for(int j = ans[i]; j <= ans[i] + r - 1; ++j)
85                     printf("%c", v[j] - 1 + 'a');
86                 printf("\n");
87             }
88         }
89         ++kase;
90     }
91     return 0;
92 }