CSES - E4590 2016 6 - Results
Submission details
Task:Rotations
Sender:Ollie
Submission time:2016-10-23 00:12:14 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.27 sdetails
#2ACCEPTED0.25 sdetails
#3ACCEPTED0.09 sdetails
#4ACCEPTED0.12 sdetails
#5ACCEPTED0.08 sdetails
#6ACCEPTED0.28 sdetails
#7ACCEPTED0.34 sdetails
#8UNKNOWN--details
#9UNKNOWN--details
#10UNKNOWN--details
#11UNKNOWN--details
#12UNKNOWN--details

Compiler report

input/code.cpp: In function 'bool leq(int, int, int, int)':
input/code.cpp:4:32: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
     return(a1 < b1 || a1 == b1 && a2 <= b2);
                                ^
input/code.cpp: In function 'bool leq(int, int, int, int, int, int)':
input/code.cpp:7:32: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
     return(a1 < b1 || a1 == b1 && leq(a2,a3, b2,b3));
                                ^
input/code.cpp: In function 'int main()':
input/code.cpp:86:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(s.length()-suff[i]<rl) i++;
                            ^

Code

#include <bits/stdc++.h>
using namespace std;
inline bool leq(int a1, int a2, int b1, int b2) {
    return(a1 < b1 || a1 == b1 && a2 <= b2);
}
inline bool leq(int a1, int a2, int a3, int b1, int b2, int b3) {
    return(a1 < b1 || a1 == b1 && leq(a2,a3, b2,b3));
} 
static void radixPass(int* a, int* b, int* r, int n, int K) {
    int* c = new int[K + 1]; 
    for (int i = 0; i <= K; i++) c[i] = 0; 
    for (int i = 0; i < n; i++) c[r[a[i]]]++; 
    for (int i = 0, sum = 0; i <= K; i++)  {
      int t = c[i];
      c[i] = sum;
      sum += t;
    }
    for (int i = 0;  i < n; i++) b[c[r[a[i]]]++] = a[i]; 
    delete [] c;
}
void suffixArray(int* s, int* SA, int n, int K) {
    int n0 = (n+2)/3, n1 = (n+1)/3, n2 = n/3, n02 = n0+n2;
    int* s12 = new int[n02+3]; s12[n02] = s12[n02+1] = s12[n02+2] = 0;
    int* SA12 = new int[n02+3]; SA12[n02] = SA12[n02+1] = SA12[n02+2] = 0;
    int* s0 = new int[n0];
    int* SA0 = new int[n0];
    for (int i=0, j=0; i < n + (n0-n1); i++)
        if (i%3 != 0) s12[j++] = i;
    radixPass(s12 , SA12, s+2, n02, K);
    radixPass(SA12, s12 , s+1, n02, K);
    radixPass(s12 , SA12, s  , n02, K);
    int name = 0, c0 = -1, c1 = -1, c2 = -1;
    for (int i = 0; i < n02; i++) {
        if (s[SA12[i]] != c0 || s[SA12[i]+1] != c1 || s[SA12[i]+2] != c2) {
            name++;
            c0 = s[SA12[i]];
            c1 = s[SA12[i]+1];
            c2 = s[SA12[i]+2];
        }
        if (SA12[i]%3 == 1) s12[SA12[i]/3] = name; 
        else s12[SA12[i]/3 + n0] = name; 
    }
    if (name < n02) {
        suffixArray(s12, SA12, n02, name);
        for (int i = 0; i < n02; i++) s12[SA12[i]] = i + 1;
    } else 
        for (int i = 0;  i < n02; i++) SA12[s12[i] - 1] = i;
    for (int i = 0, j = 0; i < n02; i++)
        if (SA12[i] < n0) s0[j++] = 3*SA12[i];
    radixPass(s0, SA0, s, n0, K);
    for (int p = 0, t = n0-n1, k = 0; k < n; k++) {
        #define GetI() (SA12[t] < n0 ? SA12[t] * 3 + 1 : (SA12[t] - n0) * 3 + 2)
        int i = GetI(); 
        int j = SA0[p]; 
        if (SA12[t] < n0 ? 
            leq(s[i], s12[SA12[t] + n0], s[j], s12[j/3]) :
            leq(s[i],s[i+1],s12[SA12[t]-n0+1], s[j],s[j+1],s12[j/3+n0]))
        {
            SA[k] = i; t++;
            if (t == n02) 
            for (k++; p < n0; p++, k++) SA[k] = SA0[p];
        } else {
            SA[k] = j; p++;
            if (p == n0) 
            for (k++; t < n02; t++, k++) SA[k] = GetI();
        }
    }
    delete [] s12; delete [] SA12; delete [] SA0; delete [] s0;
}
int suff[2000001], vals[2000001];
int main() {
  string s;
  cin >> s;
  if(s.length()==1) {
    cout<<s<<endl;
    return 0;
  } else if(s.length()==2) {
    cout<<min(s[0],s[1])<<max(s[0],s[1])<<endl;
    return 0;
  }
  int rl = s.length(), i=0;
  s += s;
  int n=s.length();
  for(int i=0;i<n;i++) vals[i]=s[i];
  suffixArray(vals, suff, n+1, 256);
  while(s.length()-suff[i]<rl) i++;
  cout << s.substr(suff[i], rl) << endl;
  return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

user output
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

Test 2

Verdict: ACCEPTED

input
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...

correct output
abbbbbbbbbbbbbbbbbbbbbbbbbbbbb...

user output
abbbbbbbbbbbbbbbbbbbbbbbbbbbbb...

Test 3

Verdict: ACCEPTED

input
jibanqfglkmsywdlqjquxxnqeyhbyu...

correct output
aaadptqmkuqxnvmojzhghqtfztbwsj...

user output
aaadptqmkuqxnvmojzhghqtfztbwsj...

Test 4

Verdict: ACCEPTED

input
muykjgvsstkgydmumitbgvsbtgyvmv...

correct output
aaaeaeipiqglrtbzelgrqmrxqbnjke...

user output
aaaeaeipiqglrtbzelgrqmrxqbnjke...

Test 5

Verdict: ACCEPTED

input
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

user output
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

Test 6

Verdict: ACCEPTED

input
aaaaaaaaabaaaaaaaaabaaaaaaaaab...

correct output
aaaaaaaaabaaaaaaaaabaaaaaaaaab...

user output
aaaaaaaaabaaaaaaaaabaaaaaaaaab...

Test 7

Verdict: ACCEPTED

input
jtcbpjizbiauauipwsdteaisynwesj...

correct output
aisynwesjvtvgghnbqyqprwpfqayzl...

user output
aisynwesjvtvgghnbqyqprwpfqayzl...

Test 8

Verdict: UNKNOWN

input
a

correct output
a

user output
(not available)

Test 9

Verdict: UNKNOWN

input
ab

correct output
ab

user output
(not available)

Test 10

Verdict: UNKNOWN

input
ba

correct output
ab

user output
(not available)

Test 11

Verdict: UNKNOWN

input
home

correct output
ehom

user output
(not available)

Test 12

Verdict: UNKNOWN

input
baaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

user output
(not available)