1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include <iostream> #include <cstring> #include <algorithm> #include <deque> #include <queue> #include <vector> #include <set> #include <map> #include <unordered_map> #include <cmath> #include <bitset> #include <iterator> #include <random> #include <iomanip> #include <cctype> #include <array>
using namespace std;
typedef long long ll; typedef pair<ll,ll> pll; typedef array<ll,3> arr; const ll MAXN=static_cast<ll>(1e6)+10; const ll base=131; ll N,T,hashe[MAXN],sa[MAXN],height[MAXN],powBase[MAXN]; string S;
inline ll get_hash(ll a,ll b){
return hashe[b]-(a>0?hashe[a-1]:0)*powBase[b-a+1]; }
inline bool comp(ll a,ll b){ ll l=0,r=min(N-a,N-b); while (l<r) { ll mid=l+r+1>>1; if(get_hash(a,a+mid-1)==get_hash(b,b+mid-1)){ l=mid; }else{ r=mid-1; } } if(a+l<N && b+l<N && S[a+l]!=S[b+l]){ return S[a+l]<S[b+l]; } return N-a<N-b; } inline void get_height(){ for(int i=1;i<N;++i){ ll a=sa[i-1],b=sa[i]; ll l=0,r=min(N-a,N-b); while (l<r) { ll mid=l+r+1>>1; if(get_hash(a, a+mid-1)==get_hash(b, b+mid-1)){ l=mid; }else{ r=mid-1; } } height[i]=l; } } inline void init(){ ll val=0; for(int i=0;i<N;++i){ val=base*val+S[i]; hashe[i]=val; sa[i]=i; } powBase[0]=1; for(int i=1;i<=N+5;++i){ powBase[i]=powBase[i-1]*base; } } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>S; N=S.size(); init(); sort(sa, sa+N, comp); comp(67,60); for(int i=0;i<N;++i) cout<<sa[i]+1<<' '; cout<<'\n'; }
|