Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
粘一个自己写的模版,不知道哪里错了,求各神牛帮忙看看!namespace SuffixArray {//SuffixArray template <typename T> void exc(T &a, T &b) {T t=a; a=b; b=t;} const int maxn = 100000*3; int t1[maxn], t2[maxn]; void createSuffixArray(char Str[], int L, int SA[], int RK[]) { int *S1, *S2, *R, *B; S1 = SA, S2 = t1; R = RK, B = t2; int i, j, k, h; for (i=0; i<128; i++) B[i] = 0; for (i=0; i<L; i++) B[Str[i]]++; for (i=1; i<128; i++) B[i] += B[i-1]; for (i=0; i<L; i++) S1[--B[Str[i]]] = i; for (R[S1[0]]=0, i=1; i<L; i++) if (Str[S1[i]] == Str[S1[i-1]]) R[S1[i]] = R[S1[i-1]]; else R[S1[i]] = R[S1[i-1]]+1; for (h=1; h<L && R[S1[L-1]]<L-1; h<<=1) { for (i=0; i<L; i++) B[i] = 0; for (i=0; i<L; i++) B[R[i]]++; for (i=1; i<L; i++) B[i] += B[i-1]; for (i=L-1; i>=0; i--) if (S1[i]>=h) S2[--B[R[S1[i]-h]]] = S1[i]-h; for (i=L-h; i<L-h/2; i++) S2[--B[R[i]]] = i; exc(S1, S2); for (B[S1[0]] = 0, i=1; i<L; i++) if (R[S1[i]]!=R[S1[i-1]] || R[S1[i]+h] != R[S1[i-1]+h]) B[S1[i]] = B[S1[i-1]]+1; else B[S1[i]] = B[S1[i-1]]; exc(B, R); } if (R != RK) memcpy(RK, R, sizeof(int)*L); if (S1 != SA) memcpy(SA, S1, sizeof(int)*L); } void createHeight(char Str[], int L, const int SA[], const int RK[], int height[], int h[]) { int p = 0; for (int i=0; i<L; i++) { if (RK[i]==0) {h[i]=0; continue;} int j = SA[RK[i]-1]; while (Str[i+p] == Str[j+p]) p++; h[i] = p; if (p>0) p--; } for (int i=0; i<L; i++) height[RK[i]] = h[i]; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator