[关闭]
@Karry5307 2019-03-25T05:10:11.000000Z 字数 1171 阅读 434

Suffix Array

未分类


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef int ll;
  4. const ll MAXN=1e6+51;
  5. ll length,sigmaSize;
  6. ll sa[MAXN],rk[MAXN],barrel[MAXN],s[MAXN];
  7. char str[MAXN];
  8. inline ll read()
  9. {
  10. register ll num=0,neg=1;
  11. register char ch=getchar();
  12. while(!isdigit(ch)&&ch!='-')
  13. {
  14. ch=getchar();
  15. }
  16. if(ch=='-')
  17. {
  18. neg=-1;
  19. ch=getchar();
  20. }
  21. while(isdigit(ch))
  22. {
  23. num=(num<<3)+(num<<1)+(ch-'0');
  24. ch=getchar();
  25. }
  26. return num*neg;
  27. }
  28. inline void radixSort()
  29. {
  30. for(register int i=0;i<=sigmaSize;i++)
  31. {
  32. barrel[i]=0;
  33. }
  34. for(register int i=1;i<=length;i++)
  35. {
  36. barrel[rk[i]]++;
  37. }
  38. for(register int i=1;i<=sigmaSize;i++)
  39. {
  40. barrel[i]+=barrel[i-1];
  41. }
  42. for(register int i=length;i;i--)
  43. {
  44. sa[barrel[rk[s[i]]]--]=s[i];
  45. }
  46. }
  47. inline void suffixArray()
  48. {
  49. for(register int i=1;i<=length;i++)
  50. {
  51. rk[i]=str[i]-'0'+1,s[i]=i;
  52. }
  53. radixSort();
  54. for(register int gap=1,p=0;p<length;sigmaSize=p,gap<<=1)
  55. {
  56. p=0;
  57. for(register int i=1;i<=gap;i++)
  58. {
  59. s[++p]=length-gap+i;
  60. }
  61. for(register int i=1;i<=length;i++)
  62. {
  63. if(sa[i]>gap)
  64. {
  65. s[++p]=sa[i]-gap;
  66. }
  67. }
  68. radixSort();
  69. swap(s,rk);
  70. rk[sa[1]]=p=1;
  71. for(register int i=2;i<=length;i++)
  72. {
  73. rk[sa[i]]=s[sa[i-1]]==s[sa[i]]&&s[sa[i-1]+gap]==s[sa[i]+gap]?p:++p;
  74. }
  75. }
  76. }
  77. int main()
  78. {
  79. scanf("%s",str+1);
  80. sigmaSize=128,length=strlen(str+1);
  81. suffixArray();
  82. for(register int i=1;i<=length;i++)
  83. {
  84. printf("%d ",sa[i]);
  85. }
  86. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注