Advertisement
RaFiN_

Suffix Array

Aug 3rd, 2019
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. #define mx 1005
  2. #define ll long long int
  3. struct suff
  4. {
  5.     int index;
  6.     int Rank[2];
  7.     bool operator <(const suff &o)const{
  8.         return (Rank[0]<o.Rank[0])||(Rank[0]==o.Rank[0]&&Rank[1]<o.Rank[1]);
  9.     }
  10. };
  11.  
  12. suff suffix[mx];ll lcp[mx];suff tmp[mx];int n,fr[mx];string s;int ind[mx],sa[mx];
  13. char str[mx];int R[mx];
  14.  
  15. void Sort(int u)
  16. {
  17.     int maxi=max(n,256);
  18.     memset(fr,0,sizeof(fr));
  19.     for(int i=0;i<n;i++)fr[suffix[i].Rank[u]+1]++;
  20.     ll sum=0;
  21.     for(int i=0;i<=maxi;i++)
  22.     {
  23.         ll prev=fr[i];
  24.         fr[i]=sum;
  25.         sum+=prev;
  26.     }
  27.     for(int i=0;i<n;i++)
  28.     {
  29.         tmp[fr[suffix[i].Rank[u]+1]]=suffix[i];
  30.         fr[suffix[i].Rank[u]+1]++;
  31.  
  32.     }
  33.     for(int i=0;i<n;i++)suffix[i]=tmp[i];
  34. }
  35.  
  36. void SA()
  37. {
  38.     int mini=10000;
  39.     for(int i=0;i<n;i++)
  40.     {
  41.         mini=min(mini,(int)s[i]);
  42.     }
  43.     for(int i=0;i<n;i++)
  44.     {
  45.         suffix[i].index=i;
  46.         suffix[i].Rank[0]=s[i]-mini;
  47.         if(i+1<n)suffix[i].Rank[1]=s[i+1]-mini;
  48.         else suffix[i].Rank[1]=-1;
  49.     }
  50.     Sort(1);Sort(0);
  51.     for(int k=4;k<2*n;k=k*2){
  52.         int r=0;
  53.         ind[suffix[0].index]=0;
  54.         int prev=suffix[0].Rank[0];
  55.         suffix[0].Rank[0]=r;
  56.         for(int i=1;i<n;i++){
  57.             if(prev==suffix[i].Rank[0]&&suffix[i].Rank[1]==suffix[i-1].Rank[1])
  58.             {
  59.  
  60.                 prev=suffix[i].Rank[0];
  61.                 suffix[i].Rank[0]=r;
  62.             }
  63.             else{
  64.                 prev=suffix[i].Rank[0];
  65.                 suffix[i].Rank[0]=++r;
  66.             }
  67.             ind[suffix[i].index]=i;
  68.         }
  69.         for(int i=0;i<n;i++){
  70.             int next=suffix[i].index+k/2;
  71.             if(next<n)suffix[i].Rank[1]=suffix[ind[next]].Rank[0];
  72.             else suffix[i].Rank[1]=-1;
  73.         }
  74.         Sort(1);Sort(0);
  75.     }
  76.  
  77.     //for(int i=0;i<n;i++)cout<<suffix[i].index<<endl;
  78. }
  79.  
  80. void kasai()
  81. {
  82.     int k=0;ll gum=0;
  83.     for(int i=0;i<n;i++)R[suffix[i].index]=i;
  84.     for(int i=0;i<n;i++)sa[R[i]]=i;
  85.     for(int i=0;i<n;i++)
  86.     {
  87.         if(R[i]==n-1)
  88.         {
  89.             k=0;
  90.             continue;
  91.         }
  92.         int j=suffix[R[i]+1].index;
  93.         while(i+k<n&&j+k<n&&s[i+k]==s[j+k])k++;
  94.         lcp[R[i]]=k;
  95.         if(k>0)k--;
  96.     }
  97.  
  98.  
  99. }
  100.  
  101. int main()
  102. {
  103.  
  104.         int t;
  105.         scanf("%d",&t);
  106.         while(t--){
  107.         scanf("%s",str);
  108.         s=str;
  109.         n=s.length();
  110.         SA();
  111.         kasai();
  112.         ll ans=0;
  113.  
  114.         //for(int i=0;i<n-1;i++)cout<<lcp[i]<<endl;
  115.         ll maxi=0,save=-1;int mnt=1,save2=1;
  116.         for(int i=0;i<n-1;i++)
  117.         {
  118.             if(lcp[i]>maxi)
  119.             {
  120.                 maxi=lcp[i];
  121.                 save=sa[i];
  122.             }
  123.         }
  124.         if(maxi==0)printf("No repetitions found!\n");
  125.         else
  126.         {
  127.             int cnt=save;
  128.             for(int i=0;i<maxi;i++)printf("%c",s[cnt++]);
  129.             for(int i=0;i<n;i++)
  130.             {
  131.                 if(sa[i]==save)
  132.                 {
  133.                     while(lcp[i]==maxi)
  134.                     {
  135.                         save2++;
  136.                         i++;
  137.                         if(i==n-1)break;
  138.                     }
  139.                     break;
  140.                 }
  141.             }
  142.             printf(" %d\n",save2);
  143.         }
  144.     }
  145.  
  146.  
  147.  
  148.     return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement