Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- using namespace std;
- typedef unsigned char uchar;
- void CreateSuffixArray(uchar* szText,
- int L, int** _S, int** _R, int** _T1, int** _T2)
- {
- int i, h, h2, *T, *S1, *S2, *R, *B;
- S1 = *_S; // h˝×şó׺Ęý×é
- S2 = *_T1; // 2h˝×şó׺Ęý×é
- R = *_R; // h˝×RankĘý×é
- B = *_T2; // Äł¸öÍ°żŐÓŕżŐĽäβ˛żµÄË÷ŇýŁ¬ĽćČÎ2h˝×RankĘý×é
- for(i = 0; i < 256; i++)
- B[i] = 0;
- for(i = 0; i < L; i++)
- B[szText[i]]++;
- for(i = 1; i < 256; i++)
- B[i] += B[i - 1];
- for(i = 0; i < L; i++)
- S1[--B[szText[i]]] = i;
- for(R[S1[0]] = 0, i = 1; i < L; i++)
- {
- if(szText[S1[i]] == szText[S1[i - 1]])
- R[S1[i]] = R[S1[i - 1]];
- else
- R[S1[i]] = R[S1[i - 1]] + 1;
- }
- // log(n)ĚËO(n)µÄ±¶ÔöĹĹĐň
- // SA(h) => Rank(h) => SA(2h) => Rank(2h) => ...
- for(h = 1; h < L && R[S1[L - 1]] < L - 1; h <<= 1)
- {
- // ĽĆËăRank(h)ĎŕͬµÄşó׺ĐγɵÄhͰβ˛żµÄË÷Ňý
- // Ľ´ÓжŕÉٸöşó׺µÄhǰ׺ĎŕͬŁ¬ËüĂDZ»·ĹÔÚŇ»¸öÍ°ÖĐ
- for(i = 0; i < L; i++)
- B[R[S1[i]]] = i;
- for(i = L - 1; i >= 0; i--)
- if(h <= S1[i])
- S2[B[R[S1[i] - h]]--] = S1[i] - h;
- for(i = L - h, h2 = L - (h >> 1); i < h2; i++)
- S2[B[R[i]]] = i;
- T = S1; S1 = S2; S2 = T;
- // ĽĆËăRank(2h)
- // 2h˝×¶ÎĘÇ·ńŇŞ·ÖÍ°Ö»Đčż´ĎŕÁÚÁ˝¸ö2hǰ׺ǰşóÁ˝°ë
- // hǰ׺ĘÇ·ńČ«˛żh˝×ĎŕµČ
- for(B[S1[0]] = 0, i = 1; i < L; i++)
- {
- // ŐâŔﲻÓĂżĽÂÇS1[i] + h»áÔ˝˝ç
- // Čçąűi´ďµ˝ÁËS1[i] + hÔ˝˝çµÄĘýÖµŁ¬
- // ÄÇĂ´Ç°ĂćŇ»¸öĚőĽţĎÔČ»˛»»áÂú×ăÁË
- // ŇňÎŞ´Ëʱ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]];
- }
- T = B; B = R; R = T;
- }
- if(*_S != S1)
- *_S = S1, *_T1 = S2;
- if(*_R != R)
- *_R = R, *_T2 = B;
- }
- void CalculateHeight(int n,uchar* s,int *sa,int *height, int *rank)
- {
- int a,i,j,*h=new int[n];
- for(i=-1;++i<n;h[i]=j){
- if(!rank[i]) j=0;
- else if(!i||h[i-1]<=1) for(a=sa[rank[i]-1],j=0;s[i+j]==s[a+j];++j);
- else for(a=sa[rank[i]-1],j=h[i-1]-1;s[i+j]==s[a+j];++j);
- }
- for(i=-1;++i<n;height[i]=h[sa[i]]);
- delete [] h;
- }
- char C[200002];
- int D[4][200001];
- int main()
- {
- int i, l1, l2, b;
- int *S, *R, *H, *T;
- gets(C);
- l1 = (int)strlen(C);
- C[l1] = '$';
- gets((char*)C + l1 + 1);
- l2 = l1 + 1 + (int)strlen(C + l1 + 1);
- S = D[0]; R = D[1];
- H = D[2]; T = D[3];
- CreateSuffixArray((uchar*)C, l2, &S, &R, &H, &T);
- //for (i = 0; i < l2; ++i)
- // printf("S[%d] = %d ;",i, S[i]);
- //printf("----------------------------\n");
- //for (i = 0; i < l2; ++i)
- // printf("R[%d] = %d ;",i, R[i]);
- //printf("----------------------------\n");
- //memset(H, 0, sizeof(H));
- //CalculateHeight((uchar*)C, l2, S, R, H, T);
- CalculateHeight(l2, (uchar*)C, S, H, R);
- //for (i = 1; i < l2; ++i)
- // printf("H[%d] = %d ;",i, H[i]);
- //printf("----------------------------\n");
- // ÇóÁ˝¸ö´®µÄ×ą«ą˛×Ó´®Ł¬Ö»ŇŞČĂÁ˝¸ö´®s1ˇ˘s2
- // Á¬˝ÓÔÚŇ»ĆđĐÎłÉŇ»¸öĐ´®Ł¬ÇółöĐ´®µÄSAˇ˘RankşÍHeight
- // şÜĎÔČ»Ł¬×ą«ą˛×Ó´®żĎ¶¨łöĎÖÔÚşó׺Ęý×éÄłĎŕÁÚÁ˝ĎîÖ®ÖĐ
- // ¸ůľÝHeightµÄ¶¨Ň壬ɨĂčŇ»±éHeightĘý×飬ŐŇĎŕÁÚÁ˝¸ö·Ö±đżŞĘĽÓÚ
- // s1şÍs2´®Äł¸öλÖõĺó׺Ł¬ÇółöËůÓĐÂú×ăŐâ¸öĚőĽţµÄ×î´óHeightĽ´żÉ
- for(b = 0, i = 1; i < l2; i++)
- {
- if(S[i] < l1 && S[i - 1] > l1 ||
- S[i] > l1 && S[i - 1] < l1)
- {
- if(H[i] > b) {
- b = H[i];
- //printf("%d\n", H[i]);
- }
- }
- }
- printf("%d\n", b);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement