Advertisement
yicongli

LG5028

Mar 8th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=1e6+57;
  17.  
  18. int s[N];
  19. int SA[N];
  20. int Rank[N];
  21. int tmp[N];
  22. int cnt[N];
  23.  
  24. inline void GetSA(int n){
  25.     int m=s[n];
  26.     for(int i=1;i<=n;++i)Rank[i]=s[i];
  27.     for(int i=1;i<=n;++i)cnt[Rank[i]]++;
  28.     for(int i=1;i<=m;++i)cnt[i]+=cnt[i-1];
  29.     for(int i=n;i>=1;--i)SA[cnt[Rank[i]]--]=i;
  30.     for(int l=1,p=0;p<n;l<<=1){
  31.         p=0;
  32.         for(int i=1;i<=l;++i)tmp[++p]=n-i+1;
  33.         for(int i=1;i<=n;++i)if(SA[i]>l)tmp[++p]=SA[i]-l;
  34.         for(int i=1;i<=m;++i)cnt[i]=0;
  35.         for(int i=1;i<=n;++i)cnt[Rank[i]]++;
  36.         for(int i=1;i<=m;++i)cnt[i]+=cnt[i-1];
  37.         for(int i=n;i>=1;--i)SA[cnt[Rank[tmp[i]]]--]=tmp[i];
  38.         swap(tmp,Rank);
  39.         Rank[SA[1]]=p=1;
  40.         for(int i=2;i<=n;++i){
  41.             if(tmp[SA[i]]!=tmp[SA[i-1]]||tmp[SA[i]+l]!=tmp[SA[i-1]+l])p++;
  42.             Rank[SA[i]]=p;
  43.         }
  44.         m=p;
  45.     }
  46. }
  47.  
  48. int Hight[N];
  49.  
  50. inline void GetHight(int n){
  51.     for(int i=1,p=0;i<=n;++i){
  52.         if(Rank[i]==1)continue;
  53.         int j=SA[Rank[i]-1];
  54.         if(p)--p;
  55.         while(s[i+p]==s[j+p])p++;
  56.         Hight[Rank[i]]=p;
  57.     }
  58. }
  59.  
  60. char str[N];
  61. int ID[N];
  62. int Min[55];
  63. int Ans[55][55];
  64.  
  65. int main(){
  66.     int n,p=0;r(n);
  67.     for(int i=1;i<=n;++i){
  68.         scanf("%s",str);
  69.         int len=strlen(str);
  70.         for(int j=0;j<len;++j){
  71.             s[++p]=str[j]-'a'+1;
  72.             ID[p]=i;
  73.         }
  74.         s[++p]=26+i;
  75.     }
  76.     GetSA(p);
  77.     GetHight(p);
  78.     for(int i=1;i<=p;++i){
  79.         int x=SA[i];
  80.         for(int j=1;j<=n;++j){
  81.             Min[j]=min(Min[j],Hight[i]);
  82.             Ans[ID[x]][j]=max(Ans[ID[x]][j],Min[j]);
  83.         }
  84.         if(ID[x])Min[ID[x]]=1e9;
  85.     }
  86.     for(int i=1;i<=n;++i,puts("")){
  87.         for(int j=1;j<=n;++j){
  88.             if(i!=j)printf("%d ",max(Ans[i][j],Ans[j][i]));
  89.         }
  90.     }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement