size_t TextIndexCSA::getSA(size_t i) const{ return csa_lookup(csa,i+1)-1; }
int *csa_batchlookup3(CSA *SA,int l, int r,int len) { int *I; /* z */ int *P; /* r i z */ int v; /* [ */ int m; /* SA */ int q; int i,j; int two; int *sa; int k,b,d,x,n,w; unsigned short *B; n = SA->n; B = SA->B; two = SA->two; sa = SA->SA; w = SA->l; I =(int *) malloc((r-l+1+1)*sizeof(*I)); P =(int *) malloc((r-l+1+1)*sizeof(*I)); #if 1 x = SA->R[(l / w)*2]; b = SA->R[(l / w)*2+1]; j = l % w; for (k=0; k<j; k++) { b += DECODENUM(B,b,&d); x += d; if (x > n) {x = -1; k--;} } for (m = 0, q = 0, i = l; i <= r; i++) { if (i % two == 0) { I[1+m] = sa[i / two]; m++; } else { P[q++] = x; } b += DECODENUM(B,b,&d); x += d; if (x > n) { x = -1; b += DECODENUM(B,b,&d); x += d; } } v = 1; #else for (q = 0, i = l; i <= r; i++) { P[q++] = i; } v = 0; m = 0; #endif while (q > 0 && v <= len) { for (k = 0, j = 0; j < q; j++) { i = P[j]; if (i % two == 0) { I[1+m] = sa[i / two] - v; m++; } else { P[k++] = csa_psi(SA,i); } } q = k; v++; } for (j = 0; j < q; j++) { I[1+m] = csa_lookup(SA,P[j])-v; m++; } qsort(I+1, r-l+1, sizeof(int), intcompare); I[0] = r-l+1; free(P); return I; }