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\n",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]='\0';
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\n",ans);
209         else printf("IDENTITY LOST\n");
210     }
211     return 0;
212 }

 

posted @ 2017-03-29 22:37  ws_ccd  阅读(140)  评论(0编辑  收藏  举报