• poj3405 Corporate Identity


    和上一个1226一样吧,这个还不用翻转

    然而本蒟蒻还是写不对,WA一片天,不知道自己搞什么,自从去了长沙感觉就是坑啊

    while(1) iq--;

      1 /*#include <cstdio>
      2 #include <iostream>
      3 #include <cstring>
      4 #define N 100005
      5 #define LL long long
      6 #define eps 1e-8
      7 using namespace std;
      8 inline int ra()
      9 {
     10     int x=0,f=1; char ch=getchar();
     11     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
     12     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
     13     return x*f;
     14 }
     15 
     16 const int M=4233;
     17 const int maxn=4000*233*3;
     18 
     19 int sa[2][maxn],rank[2][maxn],height[maxn],v[M+5];
     20 char ans[205];
     21 int n,len,id[maxn],p,q,a[maxn];
     22 bool vis[M];
     23 
     24 void cal_sa(int sa[maxn], int rank[maxn], int Sa[maxn], int Rank[maxn], int k)
     25 {
     26     for (int i=1; i<=n; i++) v[rank[sa[i]]]=i;
     27     for (int i=n; i>=1; i--) if (sa[i]>k) Sa[v[rank[sa[i]-k]]--]=sa[i]-k;
     28     for (int i=n-k+1; i<=n; i++) Sa[v[rank[i]]--]=i;
     29     for (int i=1; i<=n; i++) Rank[Sa[i]]=Rank[Sa[i-1]]+(rank[Sa[i]]!=rank[Sa[i-1]] || rank[Sa[i]+k]!=rank[Sa[i-1]+k]);
     30 }
     31 void get_height()
     32 {
     33     int k=0;
     34     for (int i=1; i<=n; i++)
     35     {
     36         if (rank[p][i]==1) height[1]=0;
     37         else
     38         {
     39             int j=sa[p][rank[p][i]-1];
     40             while (a[j+k]==a[i+k]) k++;
     41             height[rank[p][i]]=k;
     42             if (k) k--;
     43         }
     44     }
     45 }
     46 void work()
     47 {
     48     for (int i=1; i<=n; i++) v[a[i]]++;
     49     for (int i=1; i<=M; i++) v[i]+=v[i-1];
     50     for (int i=1; i<=n; i++) sa[p][v[a[i]]--]=i;
     51     for (int i=1; i<=n; i++) rank[p][sa[p][i]]=rank[p][sa[p][i-1]]+(a[sa[p][i]]!=a[sa[p][i-1]]);
     52     for (int k=1; k<n; k<<=1,swap(p,q)) cal_sa(sa[p],rank[p],sa[q],rank[q],k);
     53     get_height();
     54 }
     55 bool check(int L)
     56 {
     57     int cnt=0;
     58     memset(vis,0,sizeof(vis));
     59     for (int i=2; i<=n; i++)
     60     {
     61         if (height[i]<L) 
     62         {
     63             cnt=0;
     64             memset(vis,0,sizeof(vis));
     65             continue;
     66         }
     67         if (!vis[id[sa[p][i-1]]]) vis[id[sa[p][i-1]]]=1,cnt++;
     68         if (!vis[id[sa[p][i]]]) vis[id[sa[p][i]]]=1,cnt++;
     69         if (cnt==len)
     70         {
     71             for (int j=0; j<L; j++)
     72                 ans[j]=a[sa[p][i]+j];
     73             return 1;
     74         }
     75     }
     76     return 0;
     77 }
     78 int main(int argc, char const *argv[])
     79 {
     80     while (scanf("%d",&n) && n)
     81     {
     82         len=0;
     83         memset(v,0,sizeof(v));
     84         for (int i=1; i<=n; i++)
     85         {
     86             char ch[205]; 
     87             scanf("%s",ch+1);
     88             for (int j=1; j<=strlen(ch+1); j++) a[++len]=ch[j],id[len]=i;
     89             a[++len]=150+i; id[len]=i;
     90         }
     91         swap(n,len);
     92         work();
     93     //    for (int i=1; i<=n; i++) cout<<height[i]<<"  "<<id[sa[p][i]]<<endl;
     94         int l=1,r=205; bool flag=0;
     95         while (l<=r)
     96         {
     97             int mid=l+r>>1;
     98             if (check(mid)) flag=1,l=mid+1;
     99                 else r=mid-1;
    100         }
    101         if (flag) printf("%s
    ",ans);
    102             else puts("IDENTITY LOST");
    103     }
    104     return 0;
    105 }*/
    106 
    107 
    108 
    109 
    110 #include<cstdio>
    111 #include<iostream>
    112 #include<cstring>
    113 #include<algorithm>
    114 using namespace std;
    115 #define maxn 888888
    116 int t1[maxn],t2[maxn],c[maxn],sa[maxn],rank[maxn],height[maxn];
    117 bool cmp(int *r, int a, int b, int l)
    118 {
    119     return r[a]==r[b] && r[a+l]==r[b+l];
    120 }
    121 void da(int str[], int n, int m)
    122 {
    123     n++; int *x=t1,*y=t2;
    124     for (int i=0; i<m; i++) c[i]=0;
    125     for (int i=0; i<n; i++) c[x[i]=str[i]]++;
    126     for (int i=1; i<m; i++) c[i]+=c[i-1];
    127     for (int i=n-1; i>=0; i--) sa[--c[x[i]]]=i;
    128     for (int j=1; j<=n; j<<=1)
    129     {
    130         int p=0;
    131         for (int i=n-j; i<n; i++) y[p++]=i;
    132         for (int i=0; i<n; i++) if (sa[i]>=j) y[p++]=sa[i]-j;
    133         for (int i=0; i<m; i++) c[i]=0;
    134         for (int i=0; i<n; i++) c[x[y[i]]]++;
    135         for (int i=1; i<m; i++) c[i]+=c[i-1];
    136         for (int i=n-1; i>=0; i--) sa[--c[x[y[i]]]]=y[i];
    137         swap(x,y);
    138         p=1; x[sa[0]]=0;
    139         for (int i=1; i<n; i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
    140         if (p>=n) break;
    141         m=p;
    142     } 
    143     int k=0; n--;
    144     for (int i=0; i<=n; i++) rank[sa[i]]=i;
    145     for (int i=0; i<n; i++)
    146     {
    147         if (k) k--;
    148         int j=sa[rank[i]-1];
    149         while (str[i+k]==str[j+k]) k++;
    150         height[rank[i]]=k;
    151     }
    152 }
    153 int n,res,a[maxn],id[maxn],vis[4444];
    154 char s[222],ans[222];
    155 int check(int k)
    156 {
    157     int cnt=0;
    158     memset(vis,0,sizeof(vis));
    159     for(int i=2;i<=res;i++)
    160     {
    161         if(height[i]<k)
    162         {
    163             memset(vis,0,sizeof(vis));
    164             cnt=0;
    165             continue;
    166         }
    167         if(!vis[id[sa[i-1]]])
    168             vis[id[sa[i-1]]]=1,cnt++;
    169         if(!vis[id[sa[i]]])
    170             vis[id[sa[i]]]=1,cnt++;
    171         if(cnt==n)
    172         {
    173             for(int j=0;j<k;j++)
    174                 ans[j]=a[sa[i]+j];
    175             ans[k]='';
    176             return 1;
    177         }
    178     }
    179     return 0;
    180 }
    181 int main()
    182 {
    183     while(~scanf("%d",&n),n)
    184     {
    185         res=0;
    186         for(int i=0;i<n;i++)
    187         {
    188             scanf("%s",s);
    189             int len=strlen(s);
    190             for(int j=0;j<len;j++)
    191                 a[res]=s[j],id[res++]=i;
    192             a[res]='#'+i;
    193             id[res++]='#'+i;
    194         }
    195         a[res]=0;
    196         da(a,res,5000);
    197         int l=1,r=strlen(s),flag=0;
    198         while(l<=r) 
    199         {
    200             int mid=(l+r)>>1;
    201             if(check(mid))
    202             {
    203                 flag=1;
    204                 l=mid+1;
    205             }
    206             else r=mid-1;
    207         }
    208         if(flag)printf("%s
    ",ans);
    209         else printf("IDENTITY LOST
    ");
    210     }
    211     return 0;
    212 }
  • 相关阅读:
    94、二叉树的中序遍历 | JS
    102、二叉树的层序遍历 | JS
    111、二叉树的最小深度 | JS
    二叉树的先中后序遍历-JS非递归实现
    二叉树的先中后序遍历-JS递归实现
    深度和广度优先遍历-JS实现
    76、最小覆盖子串 | JS-字典
    extra1 二分查找与二叉判定树
    02 线性表的顺序存储
    原型、原型链、作用域、作用域链、闭包
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6642219.html
Copyright © 2020-2023  润新知