-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathsa.cpp
32 lines (32 loc) · 1.11 KB
/
sa.cpp
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
#include <bits/stdc++.h>
using namespace std;
#define N 100010
char T[ N ];
int n , RA[ N ], tempRA[ N ] , SA[ N ], tempSA[ N ] , c[ N ];
void countingSort( int k ){
int i , sum , maxi = max( 300 , n ) ;
memset( c , 0 , sizeof c ) ;
for ( i = 0 ; i < n ; i ++ ) c[ ( i + k < n ) ? RA[i + k] : 0 ] ++ ;
for ( i = sum = 0 ; i < maxi ; i ++ ) { int t = c[i] ; c[i] = sum ; sum += t ; }
for ( i = 0 ; i < n ; i ++ )
tempSA[ c[ ( SA[ i ] + k < n ) ? RA[ SA[ i ] + k ] : 0 ] ++ ] = SA[ i ] ;
for ( i = 0 ; i < n ; i ++ ) SA[ i ] = tempSA[ i ] ;
}
void constructSA(){
int r;
for ( int i = 0 ; i < n ; i ++ ) RA[ i ] = T[ i ] - '.' ;
for ( int i = 0 ; i < n ; i ++ ) SA[ i ] = i ;
for ( int k = 1 ; k < n ; k <<= 1 ) {
countingSort( k ) ; countingSort( 0 ) ;
tempRA[ SA[ 0 ] ] = r = 0;
for ( int i = 1 ; i < n ; i ++ )
tempRA[ SA[ i ] ] = ( RA[ SA[ i ] ] == RA[ SA[ i - 1 ] ] && RA[ SA[ i ] + k ] == RA[ SA[ i - 1 ] + k ] ) ? r : ++ r ;
for ( int i = 0 ; i < n ; i ++ ) RA[ i ] = tempRA[ i ] ;
}
}
int main() {
n = (int)strlen( gets( T ) ) ;
T[ n ++ ] = '.' ; // important bug fix!
constructSA() ;
return 0;
}