Advertisement
Guest User

Untitled

a guest
May 7th, 2012
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. typedef unsigned char uchar;
  7.  
  8. void CreateSuffixArray(uchar* szText,
  9. int L, int** _S, int** _R, int** _T1, int** _T2)
  10. {
  11. int i, h, h2, *T, *S1, *S2, *R, *B;
  12.  
  13. S1 = *_S; // h˝×şó׺Ęý×é
  14. S2 = *_T1; // 2h˝×şó׺Ęý×é
  15. R = *_R; // h˝×RankĘý×é
  16. B = *_T2; // Äł¸öÍ°żŐÓŕżŐĽäβ˛żµÄË÷ŇýŁ¬ĽćČÎ2h˝×RankĘý×é
  17.  
  18.  
  19. for(i = 0; i < 256; i++)
  20. B[i] = 0;
  21. for(i = 0; i < L; i++)
  22. B[szText[i]]++;
  23. for(i = 1; i < 256; i++)
  24. B[i] += B[i - 1];
  25. for(i = 0; i < L; i++)
  26. S1[--B[szText[i]]] = i;
  27.  
  28. for(R[S1[0]] = 0, i = 1; i < L; i++)
  29. {
  30. if(szText[S1[i]] == szText[S1[i - 1]])
  31. R[S1[i]] = R[S1[i - 1]];
  32. else
  33. R[S1[i]] = R[S1[i - 1]] + 1;
  34. }
  35.  
  36. // log(n)ĚËO(n)µÄ±¶ÔöĹĹĐň
  37. // SA(h) => Rank(h) => SA(2h) => Rank(2h) => ...
  38.  
  39. for(h = 1; h < L && R[S1[L - 1]] < L - 1; h <<= 1)
  40. {
  41. // ĽĆËăRank(h)ĎŕͬµÄşó׺ĐγɵÄhͰβ˛żµÄË÷Ňý
  42. // Ľ´ÓжŕÉٸöşó׺µÄhǰ׺ĎŕͬŁ¬ËüĂDZ»·ĹÔÚŇ»¸öÍ°ÖĐ
  43. for(i = 0; i < L; i++)
  44. B[R[S1[i]]] = i;
  45.  
  46.  
  47. for(i = L - 1; i >= 0; i--)
  48. if(h <= S1[i])
  49. S2[B[R[S1[i] - h]]--] = S1[i] - h;
  50.  
  51.  
  52. for(i = L - h, h2 = L - (h >> 1); i < h2; i++)
  53. S2[B[R[i]]] = i;
  54.  
  55. T = S1; S1 = S2; S2 = T;
  56.  
  57. // ĽĆËăRank(2h)
  58. // 2h˝×¶ÎĘÇ·ńŇŞ·ÖÍ°Ö»Đčż´ĎŕÁÚÁ˝¸ö2hǰ׺ǰşóÁ˝°ë
  59. // hǰ׺ĘÇ·ńČ«˛żh˝×ĎŕµČ
  60. for(B[S1[0]] = 0, i = 1; i < L; i++)
  61. {
  62. // ŐâŔﲻÓĂżĽÂÇS1[i] + h»áÔ˝˝ç
  63. // Čçąűi´ďµ˝ÁËS1[i] + hÔ˝˝çµÄĘýÖµŁ¬
  64. // ÄÇĂ´Ç°ĂćŇ»¸öĚőĽţĎÔČ»˛»»áÂú×ăÁË
  65. // ŇňÎŞ´Ëʱiǰ׺żĎ¶¨ŇŃľ­¶ŔÁ˘·ÖÍ°ÁË
  66. if(R[S1[i]] != R[S1[i - 1]] ||
  67. R[S1[i] + h] != R[S1[i - 1] + h])
  68. {
  69. B[S1[i]] = B[S1[i - 1]] + 1;
  70. }
  71. else
  72. B[S1[i]] = B[S1[i - 1]];
  73. }
  74.  
  75. T = B; B = R; R = T;
  76. }
  77.  
  78. if(*_S != S1)
  79. *_S = S1, *_T1 = S2;
  80. if(*_R != R)
  81. *_R = R, *_T2 = B;
  82. }
  83.  
  84.  
  85.  
  86. void CalculateHeight(int n,uchar* s,int *sa,int *height, int *rank)
  87. {
  88. int a,i,j,*h=new int[n];
  89. for(i=-1;++i<n;h[i]=j){
  90. if(!rank[i]) j=0;
  91. else if(!i||h[i-1]<=1) for(a=sa[rank[i]-1],j=0;s[i+j]==s[a+j];++j);
  92. else for(a=sa[rank[i]-1],j=h[i-1]-1;s[i+j]==s[a+j];++j);
  93. }
  94. for(i=-1;++i<n;height[i]=h[sa[i]]);
  95. delete [] h;
  96. }
  97.  
  98. char C[200002];
  99. int D[4][200001];
  100.  
  101. int main()
  102. {
  103. int i, l1, l2, b;
  104. int *S, *R, *H, *T;
  105.  
  106. gets(C);
  107. l1 = (int)strlen(C);
  108. C[l1] = '$';
  109. gets((char*)C + l1 + 1);
  110. l2 = l1 + 1 + (int)strlen(C + l1 + 1);
  111.  
  112. S = D[0]; R = D[1];
  113. H = D[2]; T = D[3];
  114.  
  115. CreateSuffixArray((uchar*)C, l2, &S, &R, &H, &T);
  116. //for (i = 0; i < l2; ++i)
  117. // printf("S[%d] = %d ;",i, S[i]);
  118. //printf("----------------------------\n");
  119. //for (i = 0; i < l2; ++i)
  120. // printf("R[%d] = %d ;",i, R[i]);
  121. //printf("----------------------------\n");
  122. //memset(H, 0, sizeof(H));
  123. //CalculateHeight((uchar*)C, l2, S, R, H, T);
  124. CalculateHeight(l2, (uchar*)C, S, H, R);
  125. //for (i = 1; i < l2; ++i)
  126. // printf("H[%d] = %d ;",i, H[i]);
  127. //printf("----------------------------\n");
  128. // ÇóÁ˝¸ö´®µÄ×ą«ą˛×Ó´®Ł¬Ö»ŇŞČĂÁ˝¸ö´®s1ˇ˘s2
  129. // Á¬˝ÓÔÚŇ»ĆđĐÎłÉŇ»¸öĐ´®Ł¬ÇółöĐ´®µÄSAˇ˘RankşÍHeight
  130. // şÜĎÔČ»Ł¬×ą«ą˛×Ó´®żĎ¶¨łöĎÖÔÚşó׺Ęý×éÄłĎŕÁÚÁ˝ĎîÖ®ÖĐ
  131. // ¸ůľÝHeightµÄ¶¨Ň壬ɨĂčŇ»±éHeightĘý×飬ŐŇĎŕÁÚÁ˝¸ö·Ö±đżŞĘĽÓÚ
  132. // s1şÍs2´®Äł¸öλÖõĺó׺Ł¬ÇółöËůÓĐÂú×ăŐâ¸öĚőĽţµÄ×î´óHeightĽ´żÉ
  133.  
  134. for(b = 0, i = 1; i < l2; i++)
  135. {
  136. if(S[i] < l1 && S[i - 1] > l1 ||
  137. S[i] > l1 && S[i - 1] < l1)
  138. {
  139. if(H[i] > b) {
  140. b = H[i];
  141. //printf("%d\n", H[i]);
  142. }
  143. }
  144. }
  145.  
  146. printf("%d\n", b);
  147.  
  148. return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement