Advertisement
STEFAN_STOYANOV

Suffix array

Nov 8th, 2022
870
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | Source Code | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int const maxn=1e5+10;
  4. string s;
  5. int n,sa[maxn],isa[maxn],lcp[maxn];
  6. int sas[maxn],is[maxn],pos[maxn];
  7. void gen_Sa()
  8. {
  9.     for(int i=0;i<n;++i)
  10.         sa[i]=i;
  11.     sort(sa,sa+n,[&](int o1,int o2){return s[o1]<s[o2];});
  12.     /*for(int i=0;i<n;++i)
  13.         cout<<sa[i]<<' ';
  14.     cout<<endl;*/
  15.     for(int i=1;i<n;++i)
  16.         isa[sa[i]]=(s[sa[i]]!=s[sa[i-1]])?i:isa[sa[i-1]];
  17.     /*for(int i=0;i<n;++i)
  18.         cout<<isa[sa[i]]<<' ';
  19.     cout<<endl;*/
  20.     for(int len=1;len<n;len*=2)
  21.     {
  22.         for(int i=0;i<n;++i)
  23.         {
  24.             sas[i]=sa[i];
  25.             pos[i]=i;
  26.             is[i]=isa[i];
  27.         }
  28.         for(int w,i=0;i<n;++i)
  29.         {
  30.             w=(sas[i]-len<0)?sas[i]-len+n:sas[i]-len;
  31.             sa[pos[is[w]]++]=w;
  32.         }
  33.         for(int i=1;i<n;++i)
  34.             isa[sa[i]]=(is[sa[i-1]]==is[sa[i]]&&is[(sa[i-1]+len)%n]==is[(sa[i]+len)%n])?isa[sa[i-1]]:i;
  35.     }
  36. }
  37. void genLCP()
  38. {
  39.     int k=0;
  40.     for(int j,i=0;i<n-1;++i)
  41.     {
  42.         j=sa[isa[i]-1];
  43.         cout<<j<<' '<<sa[isa[i]-1]<<endl;
  44.         while(j+k<n&&i+k<n&&s[i+k]==s[j+k])++k;
  45.         lcp[isa[i]-1]=k;
  46.         if(k)--k;
  47.     }
  48. }
  49. int main()
  50. {
  51.     cin>>s;
  52.     s+='$';
  53.     n=s.size();
  54.     gen_Sa();
  55.     for(int i=0;i<n;++i)
  56.         cout<<sa[i]<<' '<<isa[sa[i]]<<endl;
  57.     cout<<endl;
  58.     cout<<endl;
  59.     genLCP();
  60.     for(int i=0;i<n;++i)
  61.         cout<<lcp[i]<<' ';
  62.     cout<<endl;
  63. return 0;
  64. }
  65. /*
  66. banana
  67.  
  68. $
  69. a 1
  70. ana 3
  71. anana 0
  72. banana 0
  73. na 2
  74. nana 0
  75.  
  76.  
  77. abaaba
  78.  
  79. $
  80. a 1
  81. aaba 1
  82. aba 3
  83. abaaba 0
  84. ba 2
  85. baaba 0
  86. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement