Task: | Rotations |
Sender: | Ollie |
Submission time: | 2016-10-23 00:12:14 +0300 |
Language: | C++ |
Status: | READY |
Result: | ACCEPTED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.27 s | details |
#2 | ACCEPTED | 0.25 s | details |
#3 | ACCEPTED | 0.09 s | details |
#4 | ACCEPTED | 0.12 s | details |
#5 | ACCEPTED | 0.08 s | details |
#6 | ACCEPTED | 0.28 s | details |
#7 | ACCEPTED | 0.34 s | details |
#8 | UNKNOWN | -- | details |
#9 | UNKNOWN | -- | details |
#10 | UNKNOWN | -- | details |
#11 | UNKNOWN | -- | details |
#12 | UNKNOWN | -- | 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) |