| Task: | Rotations |
| Sender: | sfjiang |
| Submission time: | 2020-09-26 13:54:45 +0300 |
| Language: | C++ (C++11) |
| Status: | READY |
| Result: | TIME LIMIT EXCEEDED |
| test | verdict | time | |
|---|---|---|---|
| #1 | ACCEPTED | 0.36 s | details |
| #2 | ACCEPTED | 0.36 s | details |
| #3 | ACCEPTED | 0.08 s | details |
| #4 | ACCEPTED | 0.08 s | details |
| #5 | ACCEPTED | 0.05 s | details |
| #6 | ACCEPTED | 0.82 s | details |
| #7 | TIME LIMIT EXCEEDED | -- | details |
| #8 | ACCEPTED | 0.01 s | details |
| #9 | ACCEPTED | 0.01 s | details |
| #10 | ACCEPTED | 0.01 s | details |
| #11 | ACCEPTED | 0.01 s | details |
| #12 | ACCEPTED | 0.37 s | details |
Compiler report
input/code.cpp: In function 'void SA(char*, int)':
input/code.cpp:19:35: warning: array subscript has type 'char' [-Wchar-subscripts]
for (int i=0; i<n; ++i) c[s[i]]++;
^
input/code.cpp:21:43: warning: array subscript has type 'char' [-Wchar-subscripts]
for (int i=n-1; i>=0; --i) ar[--c[s[i]]] = i;
^
input/code.cpp: In function 'int main()':
input/code.cpp:51:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%s", input);
~~~~~^~~~~~~~~~~~~
input/code.cpp: In function 'void SA(char*, int)':
input/code.cpp:20:37: warning: iteration 2000009 invokes undefined behavior [-Waggressive-loop-optimizations]
for (int i=1; i<=MAXN; ++i) c[i]+=c[i-1];
~~~~^~~~~~~~
input/code.cpp:20:20: note: within this loop
for (int i=1; i<=MAXN; ++i) c[i]+=c[i-1];
~...Code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 2000010;
int c[MAXN], *ar, *na, *ra, *nr, a[2][MAXN], r[2][MAXN], hh[MAXN], h[MAXN];
void SA(char *s, int n) { // c[max(MAXN,MAXM)]
// s[0..n); update *ar,*ra,hh[],h[]; O(n ln n)
// ar[i]=k : s[k..n) is i th smallest suffix
// ra[i]=k : s[i..n) is k th smallest suffix
// hh[i]: length of longest common prefix of s[i..n) and the one just smaller than it
// h[i]: length of longest common prefix of i th and (i-1) th smallest suffixes
// 如果處理多個序列, 每個序列後加一個不同並沒出現過的字元, 合併為一個序列處理
memset(c, 0, sizeof(c));
ar = a[0]; na = a[1]; ra = r[0]; nr = r[1];
for (int i=0; i<n; ++i) c[s[i]]++;
for (int i=1; i<=MAXN; ++i) c[i]+=c[i-1];
for (int i=n-1; i>=0; --i) ar[--c[s[i]]] = i;
ra[ar[0]] = 0;
for (int i=1; i<n; ++i) ra[ar[i]] = ra[ar[i-1]] + (s[ar[i]]!=s[ar[i-1]]);
for (int k=1; k<n && ra[ar[n-1]]<n-1; k<<=1) {
for (int i=0; i<n; ++i) c[ra[ar[i]]] = i+1;
for (int i=n-1; i>=0; --i) if (ar[i]-k >= 0) na[--c[ra[ar[i]-k]]] = ar[i]-k;
for (int i=n-k; i<n; ++i) na[--c[ra[i]]] = i;
nr[na[0]] = 0;
for (int i=1; i<n; ++i) nr[na[i]] = nr[na[i-1]] + ( ra[na[i]]!=ra[na[i-1]] || ( na[i]+k<n && na[i-1]+k<n && ra[na[i]+k]!=ra[na[i-1]+k] ) );
swap(ar, na); swap(ra, nr);
}
for (int i=0; i<n; ++i) ra[ar[i]] = i;
for (int i=0,j,k; i<n; ++i) {
if (ra[i] == 0) hh[i] = 0;
else if ( i==0 || hh[i-1]==0 ) {
for (j=0, k=ar[ra[i]-1]; i+j<n && j+k<n && s[i+j]==s[j+k]; ++j);
hh[i] = j;
}
else {
for (j=hh[i-1]-1, k=ar[ra[i]-1]; i+j<n && j+k<n && s[i+j]==s[j+k]; ++j);
hh[i] = j;
}
} for (int i=0; i<n; ++i) h[i] = hh[ar[i]];
}
char input[MAXN];
char arr[MAXN];
int main()
{
scanf("%s", input);
strcpy(arr, input);
strcat(arr, input);
int n = strlen(input);
SA(arr, 2 * n);
int idx = -1;
for (int i = 0; i < 2 * n; i++)
{
if (ar[i] < n)
{
idx = ar[i];
break;
}
}
//for (int i = 0; i < 2* n; i++)
//{
// printf("%s\n", arr + ar[i]);
//}
arr[idx + n] = 0;
printf("%s\n", arr + idx);
return 0;
}Test details
Test 1
Verdict: ACCEPTED
| input |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
| correct output |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
| user output |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... Truncated |
Test 2
Verdict: ACCEPTED
| input |
|---|
| bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb... |
| correct output |
|---|
| abbbbbbbbbbbbbbbbbbbbbbbbbbbbb... |
| user output |
|---|
| abbbbbbbbbbbbbbbbbbbbbbbbbbbbb... Truncated |
Test 3
Verdict: ACCEPTED
| input |
|---|
| jibanqfglkmsywdlqjquxxnqeyhbyu... |
| correct output |
|---|
| aaadptqmkuqxnvmojzhghqtfztbwsj... |
| user output |
|---|
| aaadptqmkuqxnvmojzhghqtfztbwsj... Truncated |
Test 4
Verdict: ACCEPTED
| input |
|---|
| muykjgvsstkgydmumitbgvsbtgyvmv... |
| correct output |
|---|
| aaaeaeipiqglrtbzelgrqmrxqbnjke... |
| user output |
|---|
| aaaeaeipiqglrtbzelgrqmrxqbnjke... Truncated |
Test 5
Verdict: ACCEPTED
| input |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
| correct output |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
| user output |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... Truncated |
Test 6
Verdict: ACCEPTED
| input |
|---|
| aaaaaaaaabaaaaaaaaabaaaaaaaaab... |
| correct output |
|---|
| aaaaaaaaabaaaaaaaaabaaaaaaaaab... |
| user output |
|---|
| aaaaaaaaabaaaaaaaaabaaaaaaaaab... Truncated |
Test 7
Verdict: TIME LIMIT EXCEEDED
| input |
|---|
| jtcbpjizbiauauipwsdteaisynwesj... |
| correct output |
|---|
| aisynwesjvtvgghnbqyqprwpfqayzl... |
| user output |
|---|
| (empty) |
Test 8
Verdict: ACCEPTED
| input |
|---|
| a |
| correct output |
|---|
| a |
| user output |
|---|
| a |
Test 9
Verdict: ACCEPTED
| input |
|---|
| ab |
| correct output |
|---|
| ab |
| user output |
|---|
| ab |
Test 10
Verdict: ACCEPTED
| input |
|---|
| ba |
| correct output |
|---|
| ab |
| user output |
|---|
| ab |
Test 11
Verdict: ACCEPTED
| input |
|---|
| home |
| correct output |
|---|
| ehom |
| user output |
|---|
| ehom |
Test 12
Verdict: ACCEPTED
| input |
|---|
| baaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
| correct output |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
| user output |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... Truncated |
