先贴下代码,还不知道能过不能过,poj崩了
#include <algorithm>
#include <cstring>
#include <cstdio>
#include<iostream>
using namespace std;
const int maxn = 200000 + 100;
int n, k;
int a[maxn];
int rk[maxn], temp[maxn];
bool compare_sa(int i, int j){
if(rk[i] != rk[j]) return rk[i] < rk[j];
else {
int ri = i+k<=n?rk[i+k]:-1;
int rj = j+k<=n?rk[j+k]:-1;
return ri < rj;
}
}
void construct_sa(int a[], int n, int sa[]){
for(int i=0; i<n; i++) {
sa[i] = i;
rk[i] = a[i];
}
for(k=1; k<=n; k<<=1){
sort(sa, sa+n, compare_sa);
// cout<<"sa"<<endl;
// for(int i=0;i<n;i++){
// cout<<sa[i]<<" ";
// }
// cout<<endl;
temp[sa[0]] = 1;
for(int i=1; i<n; i++){
temp[sa[i]] = temp[sa[i-1]] + (compare_sa(sa[i-1], sa[i])?1:0);
}
for(int i=0; i<n; i++) rk[i] = temp[i];
// cout<<"rk"<<endl;
// for(int i=0;i<n;i++){
// cout<<rk[i]<<" ";
// }
// cout<<endl;
}
}
int rev_a[maxn], sa[maxn];
int main() {
scanf("%d", &n);
for(int i=0; i<n; i++) scanf("%d", &a[i]);
reverse_copy(a, a+n, rev_a);
// for(int i=0;i<n;i++){
// cout<<rev_a[i]<<" ";
// }
// cout<<endl;
construct_sa(rev_a, n, sa);
int p1;
for(int i=0; i<n; i++){
p1 = n - sa[i];
if(p1>=1 && n-p1>=2) break;
}
int m = n-p1;
reverse_copy(a+p1, a+n, rev_a);
reverse_copy(a+p1, a+n, rev_a+m);
// cout<<endl;
// for(int i=0;i<2*m;i++){
// cout<<rev_a[i]<<" ";
// }
// cout<<endl;
construct_sa(rev_a, 2*m, sa);
int p2;
for(int i=0; i<2*m; i++){
p2 = p1 + m - sa[i];
//cout<<m<<" "<<sa[i]<<endl;
if(p2-p1>=1 && n-p2>=1) break;
}
reverse(a, a+p1);
reverse(a+p1, a+p2);
reverse(a+p2, a+n);
for(int i=0; i<n; i++) printf("%d\n", a[i]);
return 0;
}
/*
9
8 4 -1 5 0 5 0 2 3
*/