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 }
View Code

 

posted @ 2018-04-24 20:43  啊宸  阅读(158)  评论(0编辑  收藏  举报