void csa_text_lf(uchar *p,CSA *csa, pos_t s, pos_t t) { i64 i; i64 j,c; #if DEBUG if (s < 1 || t > csa->n || s > t) { printf("csa_text: out of range [%d,%d] n=%d\n",s,t,csa->n); } #endif // lf = (lf_dna *)csa->psi_struc; i = csa->inverse(csa,(t+1)); for (j=t-s; j>=0; j--) { // printf("rank %ld\n",i); c = csa->BW(csa,i); if (c == -1) { printf("csa_text_lf: ??? j = %ld i = %ld c = %ld s=%ld t=%ld \n", j,i,c,s,t); exit(1); } // p[j] = c; putuint(p, j, c, csa->k2); i = csa->LF(csa,i); } }
static PyObject *sendPacket(PyObject *self, PyObject *args) { int goodcn = -1; packetbuf p(MAXTRANS,ENET_PACKET_FLAG_RELIABLE); putint(p, N_CLIENT); std::cout<<"N_CLIENT "; loopv(server::clients) { int cn = server::clients[i]->clientnum; if(goodcn < 0) goodcn = cn; // find a good cn } putint(p, goodcn); std::cout<<goodcn<<" "; putuint(p, (((unsigned int)PyTuple_Size(args)))*2); std::cout<<(((unsigned int)PyTuple_Size(args))*2)<<" [ "; for(Py_ssize_t i=0;i<PyTuple_Size(args);i++) { int data=PyInt_AsLong(PyTuple_GetItem(args,i)); std::cout<<data<<" "; putint(p, data); } sendpacket(-1, 1, p.finalize(), -1); std::cout<<"- sent\n"; Py_INCREF(Py_None); return Py_None; }
/////////////////////////////////////////// // i64 csa_substring(uchar *p,CSA *csa,rank_t r,i64 len) // extracts substring [s,s+len-1] into the buffer p using psi // and returns its length // length is shorter than len if (s+len-1 > n) // where s = SA[r] /////////////////////////////////////////// i64 csa_substring(uchar *p,CSA *csa,rank_t r,i64 len) { i64 i; i = 0; while (i < len) { if (r == 0) { // *p++ = 0; // $ putuint(p, i, 0, csa->k2); break; } // *p++ = csa->T(csa,r); putuint(p, i, csa->T(csa,r), csa->k2); r = csa->psi(csa,r); i++; } return i; }
i64 csa_substring_lf_naive(uchar *p,CSA *csa,rank_t r,i64 len) { i64 i; int c; // p += len; i = 0; while (i < len) { // r = csa_BW_LF_by_psi(csa,r, &c); r = csa->BW_LF(csa,r, &c); if (c == -1) { // *--p = 0; // $ putuint(p, len-1-i, 0, csa->k2); break; } // *--p = c; putuint(p, len-1-i, c, csa->k2); i++; } return i; }
/////////////////////////////////////////// // i64 csa_substring_lf(uchar *p,CSA *csa,rank_t r,i64 len) // extracts substring [s-len,s-1] into the buffer p[0,len-1] using BW // where s = SA[r] /////////////////////////////////////////// i64 csa_substring_lf(uchar *p,CSA *csa,rank_t r,i64 len) { i64 i,r2; int c; // p += len; i = 0; while (i < len) { c = csa->BW_rank(csa,r,&r2); if (c == -1) { // *--p = 0; // $ putuint(p, len-1-i, 0, csa->k2); break; } // *--p = c; putuint(p, len-1-i, c, csa->k2); r = csa->K[csa->CtoA[c]+1]-1 + r2; i++; } return i; }
/////////////////////////////////////////// // i64 csa_search_r(i64 keylen,int c, CSA *csa,rank_t *li,rank_t *ri) // returns the length of the longest suffix of key:c // where key is the substring of length keylen represented by range [*li, *ri] // returned [*li, *ri] is the range of key:c /////////////////////////////////////////// i64 csa_search_r(i64 keylen, int c, CSA *csa,rank_t *li,rank_t *ri) { uchar *substr; i64 ret; substr = mymalloc((keylen+1)*csa->k2); csa->substring(substr, csa, *li, keylen); // substr[keylen] = c; putuint(substr, keylen, c, csa->k2); ret = csa->search(substr, keylen+1, csa, li, ri); myfree(substr,(keylen+1)*csa->k2); return ret; }
/////////////////////////////////////////// // int csa_child_r(CSA *csa,i64 len,rank_t l,rank_t r,uchar *tail,rank_t *ll,rank_t *rr) // returns the number of characters following suffixes [l,r] // tail stores the list of following characters // ll and rr store ranges for the following characters // lengths of head, ll, and rr must be at least csa->m (#distinct characters) /////////////////////////////////////////// int csa_child_r(CSA *csa, i64 len, rank_t l, rank_t r, uchar *tail, rank_t *ll, rank_t *rr) { int i,c,num; int sigma; uchar *substr; rank_t *ltmp, *rtmp; uchar *tailtmp; int *hc; sigma = csa->sigma; substr = mymalloc((len+1)*csa->k2); csa->substring(substr, csa, l, len); tailtmp = mymalloc(sigma * sizeof(*tailtmp) * csa->k2); ltmp = mymalloc(sigma * sizeof(*ltmp)); rtmp = mymalloc(sigma * sizeof(*ltmp)); hc = mymalloc(sigma * sizeof(*hc)); num = csa_child_r_sub(csa, len, l, r, 0, substr, tailtmp, ltmp, rtmp); for (c=0; c<sigma; c++) hc[c] = -1; // for (i=0; i<num; i++) hc[tailtmp[i]] = i; for (i=0; i<num; i++) hc[getuint(tailtmp,i,csa->k2)] = i; i = 0; for (c=0; c<sigma; c++) { if (hc[c] >= 0) { // tail[i] = tailtmp[hc[c]]; putuint(tail,i, getuint(tailtmp,hc[c],csa->k2), csa->k2); ll[i] = ltmp[hc[c]]; rr[i] = rtmp[hc[c]]; i++; } } free(hc); free(rtmp); free(ltmp); free(tailtmp); myfree(substr,(len+1)*csa->k2); return num; }
int csa_child_rs(CSA *csa, uchar *substr, i64 len, uchar *tail, rank_t *ll, rank_t *rr) { int i,c,num; rank_t lll, rrr; i64 ret; num = 0; for (i=0; i<csa->m; i++) { c = csa->AtoC[i]; // substr[len] = c; putuint(substr, len, c, csa->k2); ret = csa->search(substr, len+1, csa, &lll, &rrr); if (ret == len+1) { tail[num] = c; ll[num] = lll; rr[num] = rrr; num++; } } return num; }
void csa_text_lf(uchar *p,CSA *csa, pos_t s, pos_t t) { i64 i,j; int c; #if DEBUG if (s < 1 || t > csa->n || s > t) { printf("csa_text: out of range [%d,%d] n=%d\n",s,t,csa->n); } #endif // lf = (lf_dna *)csa->psi_struc; i = csa->inverse(csa,(t+1)); for (j=t-s; j>=0; j--) { // printf("rank %ld\n",i); i = csa->BW_LF(csa,i, &c); #if DEBUG if (c == -1) { printf("csa_text_lf: ??? j = %ld i = %ld c = %ld s=%ld t=%ld \n", j,i,c,s,t); exit(1); } #endif // p[j] = c; #if 0 { int x,j; x = c; printf("("); for (j=0; j<csa->k2; j++) { printf("%c", x & 0xff); x >>= 8; } printf(")"); } #endif putuint(p, j, c, csa->k2); } }
void csa_new_from_bwt(CSA csa, char *fname, char *fidx, int psi_id, int idx_id, bool coded) { int k; i64 i,j,v,m; FILE *f2; i64 psize,isize; i64 n; psi_id = csa.id; if (psi_id >= 0) { printf("create psi: id=%d\n",psi_id); } if (idx_id >= 0) { printf("create idx: id=%d D=%d D2=%d\n",idx_id,csa.D,csa.D2); } psize = 0; if (psi_id >= 0) { switch (psi_id & 0x3f) { case ID_DIFF_GAMMA: case ID_DIFF_GAMMA_RL: case ID_DIFF_GAMMA_SPARSE: case ID_DIFF_GAMMA_RL_SPARSE: psize = psi1_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("Psi %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; case ID_DIFF_GAMMA_RR: psize = psi12_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("Psi %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; case ID_BWT_DNA: psize = lf_dna_makeindex(&csa, fname, coded); printf("n %ld\n",csa.n); printf("BW %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; case ID_BWT_BIT: psize = lf_bit_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("BW %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; case ID_BWT_WT: case ID_BWT_WT_HUF: case ID_BWT_WT_DENSE: case ID_BWT_WT_SPARSE4: case ID_BWT_WT_RR: psize = lf_wt_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("BW %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; #if 0 case ID_BWT_HUF: psize = lf_bwt_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("BW %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; #endif case ID_SPARSE4: psize = psi2_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("Psi %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; default: printf("psi_id = %d\n",psi_id); exit(1); } } csa.k = (blog(csa.n+1)+1+8-1)/8; for (i=0; i<SIGMA; i++) csa.CtoA[i] = -1; // csa.K[-1+1] = 0; csa.K[-1+1] = 1; for (m=0,v=1,i=0; i<SIGMA; i++) { if (csa.C[i]>0) { csa.AtoC[m] = i; csa.CtoA[i] = m; csa.K[m+1] = v; // printf("i=%ld v = %ld C[i] = %ld\n",i,v,csa.C[i]); v += csa.C[i]; m++; } } csa.K[m+1] = v; csa.m = m; if (csa.D >= csa.n) { printf("D=%d >= n=%ld\n",csa.D,csa.n); exit(0); } if (csa.D2 >= csa.n) { printf("D2=%d >= n=%ld\n",csa.D2,csa.n); exit(0); } if (idx_id >= 0) { n = csa.n; k = csa.k; //// compute SA and ISA if (csa.D > 0) csa.SA = (uchar *) mymalloc(((n-1)/csa.D+1+1)*k); if (csa.D2 > 0) csa.ISA = (uchar *) mymalloc(((n-1)/csa.D2+1+1)*k); if (csa.D == 0 && csa.D2 == 0) goto brk; switch (psi_id & 0x3f) { case ID_DIFF_GAMMA: case ID_DIFF_GAMMA_RL: case ID_DIFF_GAMMA_SPARSE: case ID_DIFF_GAMMA_RL_SPARSE: case ID_SPARSE4: case ID_DIFF_GAMMA_RR: j = 0; for (i=0; i<=n; i++) { display_progressbar("making sa ",i,n); j = csa.psi(&csa,j); // sa[j] = i; if (csa.D > 0 && j % csa.D == 0) { putuint(csa.SA,j / csa.D,i,k); } if (csa.D2 > 0 && i % csa.D2 == 0) { putuint(csa.ISA,i / csa.D2,j,k); } } // putuint(csa.SA,0,n,k); break; case ID_BWT_DNA: case ID_BWT_BIT: case ID_BWT_WT: case ID_BWT_WT_HUF: case ID_BWT_WT_DENSE: case ID_BWT_WT_SPARSE4: case ID_BWT_WT_RR: case ID_BWT_HUF: j = 0; for (i=n-1; i>=0; i--) { display_progressbar("making sa ",i,n); v = csa.LF(&csa,j); // printf("LF[%ld] = %ld\n",j,v); j = v; if (csa.D > 0 && j % csa.D == 0) putuint(csa.SA, j/csa.D , i, k); if (csa.D2 > 0 && i % csa.D2 == 0) putuint(csa.ISA, i/csa.D2, j, k); } putuint(csa.SA,0,n,k); break; default: break; } brk: //// write idx f2 = fopen(fidx,"wb"); /* directory */ if (f2 == NULL) { perror("csa2_new1: "); exit(1); } isize = 0; writeint(4,VERSION,f2); /* version */ isize += 4; writeint(1,ID_HEADER,f2); // header ID isize += 1; isize = write_header(&csa, f2, isize); if (csa.D > 0) { writeint(1,ID_SA,f2); isize += 1; isize = write_sa(&csa, f2, isize); } if (csa.D2 > 0) { writeint(1,ID_ISA,f2); isize += 1; isize = write_isa(&csa, f2, isize); } fclose(f2); if (csa.D > 0) free(csa.SA); if (csa.D2 > 0) free(csa.ISA); printf("Total %ld bytes (%1.3f bpc)\n",(psize+isize), (double)(psize+isize)*8/csa.n); } free(fidx); }
static void bvprintf(struct putcinfo *action, const char *fmt, va_list args) { const char *s = fmt; for (;; s++) { char c = GET_GLOBAL(*(u8*)s); if (!c) break; if (c != '%') { putc(action, c); continue; } const char *n = s+1; int field_width = 0; char padchar = ' '; u8 is64 = 0; for (;;) { c = GET_GLOBAL(*(u8*)n); if (!isdigit(c)) break; if (!field_width && (c == '0')) padchar = '0'; else field_width = field_width * 10 + c - '0'; n++; } if (c == 'l') { // Ignore long format indicator n++; c = GET_GLOBAL(*(u8*)n); } if (c == 'l') { is64 = 1; n++; c = GET_GLOBAL(*(u8*)n); } s32 val; const char *sarg; switch (c) { case '%': putc(action, '%'); break; case 'd': val = va_arg(args, s32); if (is64) va_arg(args, s32); if (val < 0) { putc(action, '-'); val = -val; } putuint(action, val); break; case 'u': val = va_arg(args, s32); if (is64) va_arg(args, s32); putuint(action, val); break; case 'p': val = va_arg(args, s32); putc(action, '0'); putc(action, 'x'); puthex(action, val, 8); break; case 'x': val = va_arg(args, s32); if (is64) { u32 upper = va_arg(args, s32); if (upper) { putprettyhex(action, upper, field_width - 8, padchar); puthex(action, val, 8); break; } } putprettyhex(action, val, field_width, padchar); break; case 'c': val = va_arg(args, int); putc(action, val); break; case '.': // Hack to support "%.s" - meaning string on stack. if (GET_GLOBAL(*(u8*)(n+1)) != 's') break; n++; sarg = va_arg(args, const char *); puts(action, sarg); break; case 's': sarg = va_arg(args, const char *); puts_cs(action, sarg); break; default: putc(action, '%'); n = s; } s = n; } }
/** * @brief This is an minimally useful subset of the POSIX printf() function. * * To reduce code size, this pico_printf() implementation only supports a few * conversion specifiers: * - @a 'd', @a 'u': for signed and unsigned decimal numbers, respectively; * - @a 'x', @a 'X': for hexadecimal numbers, downcase and upcase; * - @a 's': for NULL terminated strings. * * Other limitations: * - No flag specifier is implemented; * - No field width specifier is implemented; * - The only supported length modifier is 'l', which is parsed and ignored, * on supported archictetures 'int' and 'long int' are both 32 bits long. * - 32 digits maximum length for formatted numbers. */ int pico_printf(const char *format, ...) { const char *s = format; int len = 0; va_list ap; va_start(ap, format); while (*s) { char c = *s++; if (c == '%') { c = *s++; /* * Ignore 'l' length sub-specifier. * This has no effect in ILP32 (4/4/4). * In i586, 'int' and 'long int' are both 4 bytes long. */ if (c == 'l') { c = *s++; } switch (c) { #if (PICO_PRINTF_D) case 'd': { int n; n = va_arg(ap, int); if (n < 0) { len += pico_putchar('-'); n = -n; } len += putuint(n, 10, false); break; } #endif #if (PICO_PRINTF_U) case 'u': { unsigned int u; u = va_arg(ap, unsigned int); len += putuint(u, 10, false); break; } #endif #if (PICO_PRINTF_X) case 'X': case 'x': { unsigned int u; u = va_arg(ap, unsigned int); len += putuint(u, 16, c == 'X'); break; } #endif #if (PICO_PRINTF_S) case 's': { const char *str; str = va_arg(ap, const char *); len += pico_putchars(str); break; } #endif #if (PICO_PRINTF_ESC) default: len += pico_putchar('%'); case '%': len += pico_putchar(c); break; #endif } continue; } len += pico_putchar(c); }
void csa_new_from_bwt(int argc, char *argv[]) { i64 i,j,v,m; FILE *f2; i64 psize,isize; i64 n; int k; char *fname,*fidx; char *p; int psi_id, idx_id; CSA csa; int sigma; csa.sigma = 256; /* default alphabet size */ csa.k2 = 1; // for (i=0; i<SIGMA+2; i++) csa.C[i] = 0; // for (i=0; i<SIGMA; i++) csa.C[i] = 0; fname = NULL; fidx = NULL; psi_id = idx_id = -1; for (i=1; i<argc; i++) { p = argv[i]; if (p[0] == '-') { p++; switch (toupper(p[0])) { case 'I': // -I[n]:[D]:[D2] p++; idx_id = 0; csa_options(&csa, p); break; case 'P': // -P[n]:[L] p++; psi_id = 0; psi_options(&csa, p); break; case 'C': // -C[s] p++; sigma_options(&csa, p); break; default: printf("??? no such option %s\n",argv[i]); exit(1); } } else { fname = argv[i]; k = strlen(fname); fidx = mymalloc(k+5); sprintf(fidx,"%s.idx",fname); } } if (fname == NULL) { printf("no input file.\n"); exit(0); } printf("sigma = %d k2 = %d\n", csa.sigma, csa.k2); sigma = csa.sigma; csa.C = mymalloc(sizeof(*csa.C)*sigma); // csa.CtoA = mymalloc(sizeof(*csa.CtoA)*sigma); // csa.AtoC = mymalloc(sizeof(*csa.AtoC)*sigma); // csa.K = mymalloc(sizeof(*csa.K)*(sigma+2)); // for (i=0; i<sigma; i++) csa.C[i] = 0; psi_id = csa.id; if (psi_id >= 0) { printf("create psi: id=%d\n",psi_id); } if (idx_id >= 0) { printf("create idx: id=%d D=%d D2=%d\n",idx_id,csa.D,csa.D2); } psize = 0; if (psi_id >= 0) { switch (psi_id & 0x3f) { case ID_DIFF_GAMMA: case ID_DIFF_GAMMA_RL: case ID_DIFF_GAMMA_SPARSE: case ID_DIFF_GAMMA_RL_SPARSE: psize = psi1_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("Psi %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; case ID_DIFF_GAMMA_RR: psize = psi12_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("Psi %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; case ID_BWT_DNA: psize = lf_dna_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("BW %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; case ID_BWT_DNA2: psize = lf_dna2_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("BW %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; case ID_BWT_BIT: psize = lf_bit_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("BW %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; case ID_BWT_WT: case ID_BWT_WT_HUF: case ID_BWT_WT_DENSE: case ID_BWT_WT_SPARSE4: case ID_BWT_WT_RR: psize = lf_wt_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("BW %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; #if 0 case ID_BWT_HUF: psize = lf_bwt_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("BW %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; #endif case ID_SPARSE4: psize = psi2_makeindex(&csa, fname); printf("n %ld\n",csa.n); printf("Psi %ld bytes (%1.3f bpc)\n", psize,(double)psize*8/csa.n); break; default: printf("psi_id = %d\n",psi_id); exit(1); } } csa.k = (blog(csa.n+1)+1+8-1)/8; for (i=0; i<sigma; i++) csa.CtoA[i] = -1; csa.K[-1+1] = 1; for (m=0,v=1,i=0; i<sigma; i++) { if (csa.C[i]>0) { csa.AtoC[m] = i; csa.CtoA[i] = m; csa.K[m+1] = v; // printf("i=%ld v = %ld C[i] = %ld\n",i,v,csa.C[i]); v += csa.C[i]; m++; } } csa.K[m+1] = v; csa.m = m; if (csa.D >= csa.n) { printf("D=%d >= n=%ld\n",csa.D,csa.n); exit(0); } if (csa.D2 >= csa.n) { printf("D2=%d >= n=%ld\n",csa.D2,csa.n); exit(0); } if (idx_id >= 0) { n = csa.n; k = csa.k; //// compute SA and ISA if (csa.D > 0) csa.SA = mymalloc(((n-1)/csa.D+1+1)*k); if (csa.D2 > 0) csa.ISA = mymalloc(((n-1)/csa.D2+1+1)*k); if (csa.D == 0 && csa.D2 == 0) goto brk; switch (psi_id & 0x3f) { case ID_DIFF_GAMMA: case ID_DIFF_GAMMA_RL: case ID_DIFF_GAMMA_SPARSE: case ID_DIFF_GAMMA_RL_SPARSE: case ID_SPARSE4: case ID_DIFF_GAMMA_RR: j = 0; for (i=0; i<=n; i++) { display_progressbar("making sa ",i,n); j = csa.psi(&csa,j); // sa[j] = i; if (csa.D > 0 && j % csa.D == 0) { putuint(csa.SA,j / csa.D,i,k); } if (csa.D2 > 0 && i % csa.D2 == 0) { putuint(csa.ISA,i / csa.D2,j,k); } } // putuint(csa.SA,0,n,k); break; case ID_BWT_DNA: case ID_BWT_DNA2: case ID_BWT_BIT: case ID_BWT_WT: case ID_BWT_WT_HUF: case ID_BWT_WT_DENSE: case ID_BWT_WT_SPARSE4: case ID_BWT_WT_RR: case ID_BWT_HUF: j = 0; for (i=n-1; i>=0; i--) { display_progressbar("making sa ",i,n); v = csa.LF(&csa,j); // printf("LF[%ld] = %ld\n",j,v); j = v; if (csa.D > 0 && j % csa.D == 0) putuint(csa.SA, j/csa.D , i, k); if (csa.D2 > 0 && i % csa.D2 == 0) putuint(csa.ISA, i/csa.D2, j, k); } // putuint(csa.SA,0,n,k); if (csa.D > 0) putuint(csa.SA,0,n,k); // 2011-12-20 break; default: break; } brk: //// write idx f2 = fopen(fidx,"wb"); /* directory */ if (f2 == NULL) { perror("csa2_new1: "); exit(1); } isize = 0; writeint(4,VERSION,f2); /* version */ isize += 4; writeint(1,ID_HEADER,f2); // header ID isize += 1; isize = write_header(&csa, f2, isize); if (csa.D > 0) { writeint(1,ID_SA,f2); isize += 1; isize = write_sa(&csa, f2, isize); } if (csa.D2 > 0) { writeint(1,ID_ISA,f2); isize += 1; isize = write_isa(&csa, f2, isize); } fclose(f2); if (csa.D > 0) free(csa.SA); if (csa.D2 > 0) free(csa.ISA); printf("Total %ld bytes (%1.3f bpc)\n",(psize+isize), (double)(psize+isize)*8/csa.n); } free(fidx); }
int csa_child_r_sub(CSA *csa, i64 len, rank_t l, rank_t r, int num, uchar *substr, uchar *tail, rank_t *ll, rank_t *rr) { rank_t lll, rrr; i64 j, ret; int c1,c2; // printf("child_r_sub [%ld,%ld]\n",l,r); lll = l; rrr = r; for (j=0; j<len; j++) { lll = csa->psi(csa, lll); rrr = csa->psi(csa, rrr); } c1 = csa->T(csa, lll); c2 = csa->T(csa, rrr); if (c1 == c2) { // printf("num=%d c=%d [%ld,%ld]\n",num,c1,l,r); // tail[num] = c1; putuint(tail,num,c1, csa->k2); ll[num] = l; rr[num] = r; num++; } else { i64 l2,r2; if (c1 == -1) { l2 = l+1; } else { lll = l; rrr = r; // substr[len] = c1; putuint(substr, len, c1, csa->k2); ret = csa->search(substr, len+1, csa, &lll, &rrr); if (ret == len+1) { // printf("num=%d c=%d [%ld,%ld]\n",num,c1,lll,rrr); // tail[num] = c1; putuint(tail,num,c1, csa->k2); ll[num] = lll; rr[num] = rrr; num++; l2 = rrr+1; // } else { // printf("??? c1\n"); } } if (c2 == -1) { r2 = r-1; } else { lll = l; rrr = r; // substr[len] = c2; putuint(substr, len, c2, csa->k2); ret = csa->search(substr, len+1, csa, &lll, &rrr); if (ret == len+1) { // printf("num=%d c=%d [%ld,%ld]\n",num,c2,lll,rrr); // tail[num] = c2; putuint(tail,num,c2, csa->k2); ll[num] = lll; rr[num] = rrr; num++; r2 = lll-1; // } else { // printf("??? c2\n"); } } if (l2 <= r2) { num = csa_child_r_sub(csa, len, l2, r2, num, substr, tail, ll, rr); } } return num; }