This implementation is rough, slow, and requires a large amount of memory.
Struct SFX <br/>{< br/> int idx; <br/> int key1, key2; <br/> }; </P> <p> int operator <(const SFX & X, const SFX & Y) <br/>{< br/> return X. key1 <Y. key1 | X. key1 = y. key1 & X. key2 <Y. key2; <br/>}</P> <p> inlinevoidbuildrank (SFX * SFX, int * Rank, int Len, int init_rank) <br/>{< br/> int last_rank = init_rank; <br/> rank [SFX [0]. idx] = init_rank; <br/> for (INT I = 1; I! = Len; ++ I) <br/>{< br/> If (SFX [I-1] <SFX [I]) ++ last_rank; <br/> rank [SFX [I]. idx] = last_rank; <br/>}</P> <p> template <typename eletype> <br/> inlinevoidbuildsa (eletype * text, int * Sa, int * Rank, int Len) <br/>{< br/> const int charset = 128; <br/> const int count_len = max (charset, Len) + 10; <br/> SFX * SFX = new SFX [Len], * sfx_temp = new SFX [Len]; <br/> int * count_temp = new int [count_len]; </P> <P> memset (count_temp, 0, sizeof (count_temp [0]) * count_len); <br/> for (INT I = 0; I! = Len; ++ I) ++ count_temp [Text [I]; <br/> for (INT I = 1; I! = Charset; ++ I) count_temp [I] + = count_temp [I-1]; <br/> for (INT I = 0; I <Len; ++ I) <br/>{< br/> int Pos = -- count_temp [Text [I]; <br/> SFX [POS]. idx = I; <br/> SFX [POS]. key2 = 0; <br/> SFX [POS]. key1 = text [I]; <br/>}< br/> for (INT WID = 1; WID <Len; WID <= 1) <br/>{< br/> buildrank (SFX, rank, Len, 1); <br/> for (INT I = 0; I! = Len; ++ I) <br/>{< br/> SFX [I]. idx = I; <br/> SFX [I]. key1 = rank [I]; <br/> SFX [I]. key2 = I + WID <Len? Rank [I + WID]: 0; <br/>}< br/> memset (count_temp, 0, sizeof (count_temp [0]) * count_len ); <br/> for (INT I = 0; I <Len; ++ I) ++ count_temp [SFX [I]. key2]; <br/> for (INT I = 1; I <= Len; ++ I) count_temp [I] + = count_temp [I-1]; <br/> for (INT I = len-1; I> = 0; -- I) sfx_temp [-- count_temp [SFX [I]. key2] = SFX [I]; </P> <p> memset (count_temp, 0, sizeof (count_temp [0]) * count_len ); <br/> for (INT I = 0; I <Len; ++ I) ++ Count_temp [sfx_temp [I]. key1]; <br/> for (INT I = 1; I <= Len; ++ I) count_temp [I] + = count_temp [I-1]; <br/> for (INT I = len-1; I> = 0; -- I) SFX [-- count_temp [sfx_temp [I]. key1] = sfx_temp [I]; </P> <p> // sort (SFX, SFX + Len ); <br/>}< br/> for (INT I = 0; I! = Len; ++ I) SA [I] = SFX [I]. idx, rank [SA [I] = I; <br/> Delete [] count_temp; Delete [] sfx_temp; Delete [] SFX; <br/>}</P> <p> template <typename eletype> <br/> int getlcp (eletype * a, eletype * B) <br/> {int L = 0; while (* A & * B & * A = * B) {L ++; A ++; B ++;} return l ;}</P> <p> template <typename eletype> <br/> void getlcp (eletype * Text, int * Sa, int * rank, int Len, int * LCP) <br/>{< br/> LCP [0] = 0; <br/> If (RA NK [0]) <br/>{< br/> LCP [rank [0] = getlcp (text, text + SA [rank [0]-1]); <br/>}< br/> for (INT I = 1; I <Len; I ++) <br/>{< br/> If (! Rank [I]) continue; <br/> If (LCP [rank [I-1] <= 1) <br/> {<br/> LCP [rank [I] = getlcp (Text + I, text + SA [rank [I]-1]); <br/>}< br/> else <br/> {<br/> int L = LCP [rank [I-1]-1; <br/> LCP [rank [I] = L + getlcp (Text + I + L, text + SA [rank [I]-1] + l ); <br/>}< br/>