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 }