Task: | Rotations |
Sender: | sfjiang |
Submission time: | 2020-09-26 13:51:19 +0300 |
Language: | C++ (C++11) |
Status: | READY |
Result: | WRONG ANSWER |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.36 s | details |
#2 | ACCEPTED | 0.35 s | details |
#3 | WRONG ANSWER | 0.07 s | details |
#4 | WRONG ANSWER | 0.07 s | details |
#5 | WRONG ANSWER | 0.05 s | details |
#6 | WRONG ANSWER | 0.78 s | details |
#7 | TIME LIMIT EXCEEDED | -- | details |
#8 | ACCEPTED | 0.01 s | details |
#9 | WRONG ANSWER | 0.01 s | details |
#10 | ACCEPTED | 0.01 s | details |
#11 | ACCEPTED | 0.01 s | details |
#12 | WRONG ANSWER | 0.36 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); ~~~~~^~~~~~~~~~~~~
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<=1000; ++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 (ra[i] < n) { idx = ra[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: WRONG ANSWER
input |
---|
jibanqfglkmsywdlqjquxxnqeyhbyu... |
correct output |
---|
aaadptqmkuqxnvmojzhghqtfztbwsj... |
user output |
---|
pknzrwafbygupcajzvhwgljcsczyrq... Truncated |
Test 4
Verdict: WRONG ANSWER
input |
---|
muykjgvsstkgydmumitbgvsbtgyvmv... |
correct output |
---|
aaaeaeipiqglrtbzelgrqmrxqbnjke... |
user output |
---|
jdwrlvovafrrjcuwoytlmcvvxtkfnh... Truncated |
Test 5
Verdict: WRONG ANSWER
input |
---|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
correct output |
---|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
user output |
---|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... Truncated |
Test 6
Verdict: WRONG ANSWER
input |
---|
aaaaaaaaabaaaaaaaaabaaaaaaaaab... |
correct output |
---|
aaaaaaaaabaaaaaaaaabaaaaaaaaab... |
user output |
---|
baaaaaaaaabaaaaaaaaabaaaaaaaaa... 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: WRONG ANSWER
input |
---|
ab |
correct output |
---|
ab |
user output |
---|
ba |
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: WRONG ANSWER
input |
---|
baaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
correct output |
---|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
user output |
---|
abaaaaaaaaaaaaaaaaaaaaaaaaaaaa... Truncated |