0w1

Template Suffix Array

The first doubling SA that worked...
This post will be updated soon.

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e4 + 4;

char s[ MAXN ];

struct suffix_array{ // O( N lg N lg N )
  int n;
  vector< int > sa;
  suffix_array( const char *s ) : n( strlen(s) ), sa( n ) { 
    vector< int > r( n ), t( n ); 
    for( int i = 0; i < n; ++i ) r[ sa[ i ] = i ] = s[ i ];
    for( int h = 1; t[ n - 1 ] != n - 1; h *= 2) {
      auto cmp = [&](int i, int j) {
        if( r[ i ] != r[ j ]) return r[ i ] < r[ j ];
        return i + h < n && j + h < n ? r[ i + h ] < r[ j + h ] : i > j;
      };
      sort( sa.begin(), sa.end(), cmp );
      for(int i = 0; i + 1 < n; ++i ) t[ i + 1 ] = t[ i ] + cmp( sa[ i ], sa[ i + 1 ] );
      for(int i = 0; i < n; ++i )     r[ sa[ i ] ] = t[ i ];
    }
  }
  int operator[]( int i ) const{ return sa[ i ]; }
};

int main() {
  scanf( "%s", s );
  suffix_array sary( s );
  for( int i = 0; i < sary.n; ++i ) 
    printf( "%d%c", sary[i], " \n"[ i + 1 == sary.n ] );
}