Guest User

Untitled

a guest
Sep 2nd, 2019
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.95 KB | None | 0 0
  1.  
  2. class SuffixArray {
  3. public:
  4.     int maxN=int(1e6),n,gap;
  5.     int *sa,*pos,*tmp,*lcp;
  6.     string s;
  7.     SuffixArray (string S) {
  8.         s=S;
  9.         n=s.length();
  10.         sa=new int[maxN];
  11.         pos=new int[maxN];
  12.         tmp=new int[maxN];
  13.         lcp=new int[maxN];
  14.         gap=1;
  15.         memset(sa,0,sizeof(sa));
  16.         memset(pos,0,sizeof(pos));
  17.         memset(tmp,0,sizeof(tmp));
  18.         memset(lcp,0,sizeof(lcp));
  19.     }
  20.     bool sufCmp (int i, int j) {
  21.         if (pos[i] != pos[j]) {
  22.             return pos[i] < pos[j];
  23.         }
  24.         i += gap;
  25.         j += gap;
  26.         return (i < n and j < n) ? pos[i] < pos[j] : i > j;
  27.     }
  28.     void buildSA () {
  29.         for (int i=0; i<n; i++) {
  30.             sa[i]=i;
  31.             pos[i]=s[i];
  32.         }
  33.         for (gap=1; ; gap*=2) {
  34.             sort(sa,sa+n,sufCmp);
  35.             for (int i=0; i<n-1; i++) {
  36.                 tmp[i+1]=tmp[i]+sufCmp(sa[i],sa[i+1]);
  37.             }
  38.             for (int i=0; i<n; i++) {
  39.                 pos[sa[i]]=tmp[i];
  40.             }
  41.             if (tmp[n-1]==n-1) {
  42.                 break;
  43.             }
  44.         }
  45.     }
  46.     ~SuffixArray () {
  47.         delete []sa;
  48.         delete []pos;
  49.         delete []tmp;
  50.         delete []lcp;
  51.     }
  52. };
Add Comment
Please, Sign In to add comment