Index: lib/dataStructure/rmq.cpp ================================================================== --- lib/dataStructure/rmq.cpp +++ lib/dataStructure/rmq.cpp @@ -1,14 +1,14 @@ //------------------------------------------------------------- // Range Minimum Query // O(N log N) construction -// O(1) per each query -// returns the LEFTMOST/ALL minimum index (I hope) +// O(log N) per each query // // Verified by // - SRM337 Div1 LV2 // - SRM431 Div1 LV3 +// - Codeforces 129 Div1 E //------------------------------------------------------------- template struct RMQ { @@ -28,18 +28,20 @@ if( d[rm[k][x]] > d[rm[k-1][x + (1< all(int L, int R) const { vector ans; int minValue = d[(*this)(L, R)]; while( L <= R ) { int C = (*this)(L, R); @@ -48,6 +50,52 @@ ans.push_back(C); L = C+1; } return ans; } + + // max {i in [L,R] | d[i]R) return -1; + + int k=0; + for(; L+(1<R) return -1; + + int k=0; + for(; L+(1<& sr) : sp(sp), sr(&sr[0]), srlen(sr.size()) {} + bool operator()(int a, int b) const + { return make_pair(sr[a], a+sp +vector compute_suffix_array(RanIt beg, RanIt end) +{ + const int N = end - beg; + + vector sa(N); + vector sort_rank(beg, end); + for(int i=0; i block_id(N); + for(int i=1; i inv_sa(const vector& sa) +{ + vector isa(sa.size()); + for(int i=0; i +vector longest_common_prefix(RanIte beg, RanIte end, const vector& sa) +{ + const int N = sa.size(); + vector lcp(N); + vector inv = inv_sa(sa); + + int len = 0; + for(int i=0; i