poj3294Life Forms
我真是一个垃圾
模板题都不会做
模板题还要别人教
细节写法还要别人教
别人一分钟AC,教我算法还教我写法,最后写出来的别人算法还比我优秀一百倍
数据结构把脑子学傻了,看到题就想怎么用数据结构,半天做不来
别人1sAC,不是单调的么
纠结中间插啥子值,人家告诉我转为Int
最后还傻逼地写st表求lcp,人家直接单调队列
题读错了de半个晚上,还一直pe
mdzz,全世界都找不出第二个比我更蠢的人了
人家都线性代数学得风声水起了,我还在写傻逼题
全机房就我不会线性代数了
包括高一在内就我不知道FFT原理
啥子特征多项式,啥子特征值,
啥子啦普拉斯展开,啥子多项式求逆,啥子多项式取模,啥子多项式exp,啥子多点插值快速求值,别人信手拈来
就我一个傻逼连线性代数的门都没摸到
我tm连求导都求不陈展,微积分根本不知道是什么东西
数学烂得一塌糊涂
垃圾的一比
全机房最垃圾
心情不好,就想骂自己
我就tmd是一个世界无敌大傻逼
1 //Achen
2 #include<algorithm>
3 #include<iostream>
4 #include<cstring>
5 #include<cstdlib>
6 #include<vector>
7 #include<cstdio>
8 #include<queue>
9 #include<cmath>
10 #include<set>
11 #define For(i,a,b) for(int i=(a);i<=(b);i++)
12 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
13 const int N=400007;
14 typedef long long LL;
15 typedef double db;
16 using namespace std;
17 int n,s[N],bl[N],r[N],lcp[N],len;
18 char ss[N];
19
20 template<typename T> void read(T &x) {
21 char ch=getchar(); x=0; T f=1;
22 while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
23 if(ch=='-') f=-1,ch=getchar();
24 for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
25 }
26
27 int sa[N],rak[N],h[N],st[N][20];
28 void make_hight(int n) {
29 For(i,0,n-1) rak[sa[i]]=i;
30 for(int i=0,k=0;i<n;i++) {
31 if(!rak[i]) continue;
32 if(rak[i]==1) {
33 int debug=1;
34 }
35 if(k) k--;
36 int j=sa[rak[i]-1];
37 while(s[i+k]==s[j+k]) k++;
38 h[rak[i]]=k;
39 st[rak[i]-1][0]=k;
40 }
41 For(j,1,18) For(i,0,n-1) if(i+(1<<j)<n)
42 st[i][j]=min(st[i][j-1],st[i+(1<<j-1)][j-1]);
43 }
44
45 int cmp(int a,int b,int y[],int k) {
46 int o1=a+k>=len?-1:y[a+k];
47 int o2=b+k>=len?-1:y[b+k];
48 return o1==o2&&y[a]==y[b];
49 }
50
51 void make_sa(int n) {
52 static int c[N],t1[N],t2[N];
53 int m=145,*x=t1,*y=t2,p;
54 For(i,0,m-1) c[i]=0;
55 For(i,0,n-1) c[x[i]=s[i]]++;
56 For(i,1,m-1) c[i]+=c[i-1];
57 Rep(i,n-1,0) sa[--c[x[i]]]=i;
58 for(int k=1;k<=n;k<<=1) {
59 p=0;
60 For(i,n-k,n-1) y[p++]=i;
61 For(i,0,n-1) if(sa[i]>=k) y[p++]=sa[i]-k;
62 For(i,0,m-1) c[i]=0;
63 For(i,0,n-1) c[x[y[i]]]++;
64 For(i,1,m-1) c[i]+=c[i-1];
65 Rep(i,n-1,0) sa[--c[x[y[i]]]]=y[i];
66 swap(x,y); x[sa[0]]=0; p=1;
67 For(i,1,n-1)
68 x[sa[i]]=cmp(sa[i],sa[i-1],y,k)?p-1:p++;
69 m=p;
70 if(p>=n) break;
71 }
72 make_hight(n);
73 }
74
75 int get_lcp(int i,int j) {
76 int k=0;
77 for(k;i+(1<<k)<=j;k++); if(k) k--;
78 return min(st[i][k],st[j-(1<<k)][k]);
79 }
80
81 int cnt[N],no[N],tot;
82 void solve() {
83 int ans=0,pos=-1; tot=0;
84 while(pos+1<len&&tot*2<=n) {
85 pos++;
86 cnt[bl[sa[pos]]]++;
87 if(cnt[bl[sa[pos]]]==1) tot++;
88 }
89 if(tot*2<n) { puts("?"); return; }
90 lcp[0]=get_lcp(0,pos);
91 ans=lcp[0];
92 For(i,1,len-1) {
93 no[i]=0;
94 cnt[bl[sa[i-1]]]--;
95 if(!cnt[bl[sa[i-1]]]) tot--;
96 while(pos+1<len&&tot*2<=n) {
97 pos++;
98 cnt[bl[sa[pos]]]++;
99 if(cnt[bl[sa[pos]]]==1) tot++;
100 }
101 if(tot*2>=n) lcp[i]=get_lcp(i,pos);
102 else lcp[i]=0;
103 ans=max(ans,lcp[i]);
104 if(lcp[i]==lcp[i-1]&&h[i]>=lcp[i]) no[i]=1;
105 }
106 if(!ans) { puts("?"); return; }
107 For(i,0,len-1) if(!no[i]&&lcp[i]==ans) {
108 For(j,sa[i],sa[i]+lcp[i]-1)
109 printf("%c",'a'+s[j]);
110 puts("");
111 }
112 //puts("");
113 }
114
115 //#define DEBUG
116 int main() {
117 #ifdef DEBUG
118 freopen("std.in","r",stdin);
119 //freopen(".out","w",stdout);
120 #endif
121 int id=28,flag=0;
122 for(;;) {
123 read(n);
124 if(!n) break;
125 len=0; id=28;
126 For(i,1,n) {
127 scanf("%s",ss);
128 int tp=strlen(ss);
129 For(j,0,tp-1) { s[len++]=ss[j]-'a'; bl[len-1]=i; }
130 s[len++]=++id;
131 }
132 For(i,0,150) cnt[i]=0;
133 make_sa(len);
134 if(flag++) puts("");
135 solve();
136 }
137 return 0;
138 }