Пример #1
0
int suffix_array_search (suffix_array_t *A, unsigned char *x, int m, int *common_length) {
  const int n = A->n;
  int d = -1, ld = 0;
  int f = n, lf = 0;
  while (d + 1 < f) {
    int i = (d + f) >> 1;
    const int lcp_di = get_lcp (A, d, i), lcp_if = get_lcp (A, i, f);
    vkprintf (3, "suffix_array_search (%.*s), d = %d, ld = %d, f = %d, lf = %d, lcp_di = %d, lcp_if = %d\n", m, x, d, ld, f, lf, lcp_di, lcp_if);    
    if (ld <= lcp_if && lcp_if < lf) {
      d = i;
      ld = lcp_if;
    } else if (ld <= lf && lf < lcp_if) {
      f = i;
    } else if (lf <= lcp_di && lcp_di < ld) {
      f = i;
      lf = lcp_di;
    } else if (lf <= ld && ld < lcp_di) {
      d = i;
    } else {
      const int li = n - A->p[i];
      int l = (ld >= lf) ? ld : lf, o;
      int max_o = li;
      if (max_o > m) { 
        max_o = m; 
      }
      max_o -= l;
      unsigned char *s = x + l, *t = A->y + (A->p[i] + l);
      for (o = 0; o < max_o && *s == *t; o++, s++, t++) {}
      l += o;
      if (l == m && l == li) {
        *common_length = m;
        return A->p[i];
      } else if (l == li || (l != m && *t < *s)) {
        d = i;
        ld = l;
      } else {
        f = i;
        lf = l;
      }
    }
  }
  if (ld >= lf) {
    *common_length = ld;
    return d >= 0 ? A->p[d] : -1;
  }
  *common_length = lf;
  return f < n ? A->p[f] : -1;
}
Пример #2
0
bool operator <(const Data &a, const Data &b) {
    if (a.i == -1) {
        return false;
    }
    if (b.i == -1) {
        return true;
    }
    int x = get_lcp(a.i, a.j);
    int z = get_lcp(a.i, b.i);
    if (z < x && string[a.i + z] != string[b.i + z]) {
        return string[a.i + z] < string[b.i + z];
    }
    if (a.i != b.i) {
        return a.i < b.i;
    }
    return a.j < b.j;
}