fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define endl '\n'
  4.  
  5. struct SuffixArray {
  6. vector<int> sa, lcp;
  7. vector<int> sort_cyclic_shifts(string const& s) {
  8. int n = s.size();
  9. const int alphabet = 256;
  10. vector<int> p(n), c(n), cnt(max(alphabet, n), 0);
  11. for (int i = 0; i < n; i++)
  12. cnt[s[i]]++;
  13. for (int i = 1; i < alphabet; i++)
  14. cnt[i] += cnt[i-1];
  15. for (int i = 0; i < n; i++)
  16. p[--cnt[s[i]]] = i;
  17. c[p[0]] = 0;
  18. int classes = 1;
  19. for (int i = 1; i < n; i++) {
  20. if (s[p[i]] != s[p[i-1]])
  21. classes++;
  22. c[p[i]] = classes - 1;
  23. }
  24. vector<int> pn(n), cn(n);
  25. for (int h = 0; (1 << h) < n; ++h) {
  26. for (int i = 0; i < n; i++) {
  27. pn[i] = p[i] - (1 << h);
  28. if (pn[i] < 0)
  29. pn[i] += n;
  30. }
  31. fill(cnt.begin(), cnt.begin() + classes, 0);
  32. for (int i = 0; i < n; i++)
  33. cnt[c[pn[i]]]++;
  34. for (int i = 1; i < classes; i++)
  35. cnt[i] += cnt[i-1];
  36. for (int i = n-1; i >= 0; i--)
  37. p[--cnt[c[pn[i]]]] = pn[i];
  38. cn[p[0]] = 0;
  39. classes = 1;
  40. for (int i = 1; i < n; i++) {
  41. pair<int, int> cur = {c[p[i]], c[(p[i] + (1 << h)) % n]};
  42. pair<int, int> prev = {c[p[i-1]], c[(p[i-1] + (1 << h)) % n]};
  43. if (cur != prev)
  44. ++classes;
  45. cn[p[i]] = classes - 1;
  46. }
  47. c.swap(cn);
  48. }
  49. return p;
  50. }
  51.  
  52. vector<int> lcp_construction(string const& s) {
  53. int n = s.size();
  54. vector<int> rank(n, 0);
  55. for (int i = 0; i < n; i++)
  56. rank[sa[i]] = i;
  57.  
  58. int k = 0;
  59.  
  60. //kasai, modified a bit for circular rotations
  61. vector<int> lcp(n, 0);
  62. for (int i = 0; i < n; i++) {
  63. if (rank[i] == n - 1) {
  64. //if first suffix and last suffix start with same char, string is a repeated single char
  65. k = s[sa[0]]==s[i]?n:0;
  66. }else{
  67. int j = sa[rank[i] + 1];
  68. while (k < n && s[(i+k)%n] == s[(j+k)%n])
  69. k++;
  70. }
  71. lcp[rank[i]] = k;
  72. if (k)
  73. k--;
  74. }
  75. return lcp;
  76. }
  77.  
  78. SuffixArray(const string &s) {
  79. sa = sort_cyclic_shifts(s);
  80. lcp = lcp_construction(s);
  81. }
  82. };
  83.  
  84. int main() {
  85. ios::sync_with_stdio(false);
  86. cin.tie(0);
  87. int n;
  88. cin>>n;
  89. string s(n,0);
  90. vector<int> vec(n);
  91. for(int i=0;i<n;++i){
  92. cin>>vec[i];
  93. }
  94.  
  95. for(int i=0;i<n;++i){
  96. s[i]=vec[i]<vec[(i+1)%n]?'a':'b';
  97. }
  98.  
  99. SuffixArray sa(s);
  100.  
  101. vector<int> ans(n);
  102. for (int i=0;i<n;++i) {
  103. int x = max(sa.lcp[i],sa.lcp[(i+n-1)%n])+1;
  104. ans[sa.sa[i]]=x<=n ? x : -1;
  105. }
  106. for(int i = 0;i<n;++i){
  107. cout<<ans[i]<<endl;
  108. }
  109. return 0;
  110. }
  111.  
Success #stdin #stdout 0.01s 5288KB
stdin
4
1
4
2
3
stdout
-1
-1
-1
-1