Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6.  
  7. const int MAXN = 1e5 + 5;
  8.  
  9. struct entry{
  10. //p[k-1][i] , p[k-1][i + s^(k-1)]
  11. int pi[2];
  12. int ind;
  13. }L[MAXN];
  14.  
  15. bool comp(entry p1, entry p2){
  16. return (p1.pi[0] == p2.pi[0]) ? (p1.pi[1] < p2.pi[1]) : (p1.pi[0] < p2.pi[0]);
  17. }
  18.  
  19. int P[(int)ceil(log2(MAXN)) + 1][MAXN];
  20.  
  21. vector<pair<int,int> > vec[MAXN];
  22. vector<pair<int,int> > countSort(vector<pair<int,int> > &vecc){
  23. vector<int> cnt(MAXN , 0);
  24. for(int i=0;i<vecc.size();i++){
  25. cnt[vecc[i].first]++;
  26. }
  27. for(int i=0;i<MAXN;i++){
  28. cnt[i] += i > 0 ? cnt[i-1] : 0;
  29. }
  30. vector<pair<int,int> > sorted(vecc.size());
  31. for(int i=0;i<vecc.size();i++){
  32. sorted[cnt[vecc[i].first] - 1] = vecc[i];
  33. cnt[vecc[i].first]--;
  34. }
  35. return sorted;
  36. }
  37.  
  38.  
  39. void suffixArray(string str , bool fast){
  40. vector<pair<char,int> > tmp;
  41. for(int i=0;i<str.length();i++){
  42. tmp.push_back({str[i],i});
  43. }
  44. sort(tmp.begin(),tmp.end());
  45. for(int i=0;i<tmp.size();i++){
  46. P[0][tmp[i].second] = i > 0 && tmp[i].first == tmp[i-1].first ? P[0][tmp[i-1].second] : i;
  47. }
  48.  
  49. int step = 1;
  50. for(; (step << 1) <= str.length() ; step++){
  51. for(int i=0;i<str.length();i++){
  52. L[i].pi[0] = P[step - 1][i];
  53. L[i].pi[1] = (i + (1 << (step - 1)) <= str.length()) ? P[step - 1][i + (1 << (step - 1))] : -1 ;
  54. L[i].ind = i;
  55. }
  56.  
  57.  
  58. //using counting sort if n * log^2(n) not working
  59.  
  60. if(fast){
  61. for(int i=0;i<MAXN;i++){
  62. vec[i].clear();
  63. }
  64. for(int i=0;i<str.length();i++){
  65. vec[L[i].pi[0] + 1].push_back({L[i].pi[1] + 1 , L[i].ind});
  66. }
  67. for(int i=0;i<MAXN;i++){
  68. if(vec[i].size() > 0){
  69. vec[i] = countSort(vec[i]);
  70. }
  71. }
  72.  
  73. int ind = 0;
  74. for(int i=0;i<MAXN;i++){
  75. for(int j=0;j<vec[i].size();j++){
  76. P[step][vec[i][j].second] = (j > 0 && vec[i][j].first == vec[i][j-1].first)? P[step][vec[i][j-1].second] : ind;
  77. ind++;
  78. }
  79. }
  80. }
  81.  
  82. //using normal sort easy to implement n * log^2(n)
  83. else{
  84. sort(L , L + MAXN , comp);
  85. for(int i=0;i<MAXN;i++){
  86. P[step][L[i].ind] = (i > 0 && L[i-1].pi[0] == L[i].pi[0] && L[i-1].pi[1] == L[i].pi[1]) ? P[step][L[i-1].ind] : i;
  87. }
  88. }
  89. }
  90. }
  91.  
  92. int main()
  93. {
  94.  
  95. // int ans = 0;
  96. // for(int i=0;i<=(ceil(log2(str.length())));i++){
  97. // set<int> sety;
  98. // for(int j=0;j<str.size();j++){
  99. // if(j + (1<<i) - 1 >= str.length())continue;
  100. // sety.insert(P[i][j]);
  101. // }
  102. // ans+=sety.size();
  103. // }
  104. // cout << ans;
  105.  
  106.  
  107. int t;
  108. cin >> t;
  109. while(t--){
  110. int len;
  111. cin >> len;
  112. string str;
  113. cin >> str;
  114. suffixArray(str+str , true);
  115.  
  116. int order = 1e9 , ind;
  117. for(int j=0;j<str.size();j++){
  118. if(P[(int)ceil(log2(str.length()))][j] < order){
  119. order = P[(int)ceil(log2(str.length()))][j];
  120. ind = j;
  121. }
  122. }
  123. cout << ind << "\n";
  124. }
  125. return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement