zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    2019年春总结作业
    第十二周编程总结
    第十一周编程总结
    第九周编程总结
    第八周编程总结
    第七周编程总结
    2019春第五周作业
    2019年春季学期第四周作业
    2019年春季学期第三周作业
    2019年春季学期第二周作业
  • 原文地址:https://www.cnblogs.com/Achenchen/p/8933560.html
Copyright © 2011-2022 走看看