Advertisement
LinKin

Suffix Array( nlogn )

Jul 8th, 2013
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.25 KB | None | 0 0
  1. long S[2*MAXN];
  2. long N,lj,ljj;
  3. long ord[MAXLG][2*MAXN],t[2*MAXN][2];
  4. long A[2*MAXN], B[2*MAXN], C[2*MAXN], D[2*MAXN],id[MAXN];
  5.  
  6. void Build( void ){
  7.     long i,j,k,jj;
  8.     memset(A, 0, sizeof(A));
  9.     for (i = 0; i < N; ++i) A[(long)S[i]] = 1;
  10.     for (i = 1; i < 301; ++i) A[i] += A[i-1];
  11.     for (i = 0; i < N; ++i) ord[0][i] = A[(long)S[i]];
  12.     for (j = 0, jj = 1, k = 0; jj < N ; ++j, jj <<= 1){
  13.         memset(A, 0, sizeof(A)); memset(B, 0, sizeof(B));
  14.         for (i = 0; i < N; ++i){
  15.             ++A[ t[i][0] = ord[j][i] ], ++B[ t[i][1] = (i+jj<N) ? ord[j][i+jj] : 0 ];
  16.         }
  17.         for (i = 1; i <= N; ++i) A[i] += A[i-1], B[i] += B[i-1];
  18.         for (i = N-1; i >= 0; --i) C[--B[t[i][1]]] = i;
  19.         for (i = N-1; i >= 0; --i) D[--A[t[C[i]][0]]] = C[i];
  20.         ord[j+1][D[0]] = k = 1;
  21.         for (i = 1; i < N; ++i){
  22.             ord[j+1][D[i]] = (k += (t[D[i]][0] != t[D[i-1]][0] || t[D[i]][1] != t[D[i-1]][1]));
  23.         }
  24.     }
  25.     lj = j; ljj = jj;
  26.     for( i=0;i<N;i++ ) id[ord[lj][i]] = i;
  27. }
  28. long Lcp( long x, long y ){
  29.     long k,j,jj, prf = 0;
  30.     for (j = lj, jj = ljj; j >= 0; --j, jj >>= 1)
  31.         if (x<N && y<N && ord[j][x] == ord[j][y]){
  32.             x   += jj; y   += jj; prf += jj;
  33.         }
  34.     return prf;
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement