//------------------------------------------------------------- // Larsson-Sadakane's algorithm // To compile, perform: gcc -std=c99 SALS.s -o SALS // To run, SALS . e.g., SALS 100 //------------------------------------------------------------- #include #include #include #include #include #include "MT.h" // Use the Mersenne Twister. #define DEBUG // これを定義すると #ifdef #endif の中の が実行されるので、デバッグの時だけ動かしたいコードを入れるのに便利です. デバッグしないときはコメントではずしましょう. void dump_SA_ISA(int *SA, int *ISA, int h, int n){ printf("h = %i, n = %i\n", h, n); printf("SA = "); for(int i=0; i r) return; if(l == r){ ISA[SA[l]] = l; return; } int pivot = l + genrand_int32() % (r-l+1); int v = ISA[SA[pivot]+h]; int i=l; int mi=l; int j=r; int mj=r; int tmp; for(;;){ for( ; i <= j && ISA[SA[i]+h] <= v; i++) if(ISA[SA[i]+h] == v){ tmp = SA[i]; SA[i] = SA[mi]; SA[mi] = tmp; mi++; } for( ; i <= j && v <= ISA[SA[j]+h]; j--) if(ISA[SA[j]+h] == v){ tmp = SA[j]; SA[j] = SA[mj]; SA[mj] = tmp; mj--; } if(i > j) break; tmp = SA[i]; SA[i] = SA[j]; SA[j] = tmp; i++; j--; } for(mi--, i--; l <= mi; mi--, i--){ tmp = SA[i]; SA[i] = SA[mi]; SA[mi] = tmp; } for(mj++, j++; mj <= r; mj++, j++){ tmp = SA[j]; SA[j] = SA[mj]; SA[mj] = tmp; } ternary_split_quicksort_LS(SA, l, i, ISA, h); // for(int k=i+1; k S[j]) return(0); } // if(aI < aJ) return(0); else return(1); } int main(int argc, char *argv[]) { if(argc != 2){ fprintf(stderr, "Usage: SALS \n"); exit(EXIT_FAILURE); } int n = atoi(argv[1]); if(n <= 0){ fprintf(stderr, "The argument must be a positive integer\n"); exit(EXIT_FAILURE); } int *S = (int *)malloc(sizeof(int) * n); // Use the heap for the input string. if(S == NULL) exit(EXIT_FAILURE); int *SA = (int *)malloc(sizeof(int)*n); if(SA == NULL){ free(S); exit(EXIT_FAILURE); } // We encode $,A,C,G,T by 0,1,2,3,4 so that $=0 < A=1 < C=2 < G=3 < T=4 for(int i=0; i