#include #include #include /* ************************************************************************** * can be compiled in 32 or 64 bits * ************************************************************************** */ //#define _debug //unblock if interested in displaying of the interim data for all steps /* ************************************************************************** * The following are support routines for producing the test data * ************************************************************************** */ // returns the length of the longest Lyndon prefix of x // function maxLyndon -------------------------------------------------------- int maxLyndon(char* x,int len) { int i; int p=1; int max=1; for(i = 1; i 0 if x[from1..to1] is bigger than x[from2..to2] in lexorder // returns = 0 if x[from1..to1] equals x[from2..to2] // function ss_comp ---------------------------------------------------------- int ss_comp(char* x,int from1,int to1,int from2,int to2) { int t1, t2; for(t1=from1, t2=from2; ; t1++, t2++) { if (x[t1]x[t2]) return 1; if (t1==to1 || t2==to2) break; } if (t1==to1 && t2==to2) return 0; if (t1==to1) return -1; return 1; }//end ss_comp // compute suffix array of x[0..len-1] by brute force // function SA ------------------------------------------------------------- void SA(char *x,int len,int sa[]) { int i, j, t; for(i=0; i0; i--) { for(j=0; j0) { t=sa[j]; sa[j]=sa[j+1]; sa[j+1]=t; } } } #ifdef _debug printf("suffix array:\n"); for(int i=0; i=0; i--) { for(j=0; j0) { temp=sla[0][j]; sla[0][j]=sla[0][j+1]; sla[0][j+1]=temp; } } } for(i=0; i0;i--) { if (sla[1][i-1]==sla[1][i]) { if (ss_comp(x,sla[0][i-1],sla[0][i-1]+sla[1][i-1]-1,sla[0][i],sla[0][i]+sla[1][i]-1)==0) sla[1][i]=0; } } #ifdef _debug printf("sla:\n"); show(sla[0],len); show(sla[1],len); //getchar(); #endif // reverse order in the groups to get just a partially sorted SLA int start, end; for(i=0; i%d",I[i],k); while(true) { k=Deltas[k]; if (k==_null) break; printf(",%d->%d",I[i],k); } putchar('\n'); } if ((k=DeltaStart[len])!=_null) { printf("X->%d",k); while(true) { k=Deltas[k]; if (k==_null) break; printf(",X->%d",I[i],k); } } //getchar(); #endif // so we have triples sorted in (I,G,SG) // we have inverse delta relation in DeltaStart, Deltas // we need to preserve psla[1] // our target is psla[0] // we have available: _I,_G,_SG, DeltaEnd // we use _I for sgPtr, _G for sgStart, _SG for inSerted // in this loop while computing sgPtr and sgStart, we also initialize inSerted[] sgPtr=_I; sgStart=_G; inSerted=_SG; int last=0; sgPtr[I[0]]=0; sgStart[0]=0; inSerted[0]=0; for(i=1; i