bingxuan9112

SA

Feb 26th, 2020
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.75 KB | None | 0 0
  1. template<typename Str>
  2. struct SuffixArray {
  3.     vector<int> rk,tmp,sa;
  4.     SuffixArray(Str s) {
  5.         int n = s.size();
  6.         sa.resize(n), rk.resize(n), tmp.resize(n);
  7.         iota(all(sa),0);
  8.         for(int i = 0; i < n; i++) rk[i] = s[i];
  9.         for(int L = 1; L < n; L<<=1) {
  10.             auto cmp = [&](int a,int b) {
  11.                 if(rk[a] != rk[b]) return rk[a] < rk[b];
  12.                 int ra = a+L<n ? rk[a+L] : -1;
  13.                 int rb = b+L<n ? rk[b+L] : -1;
  14.                 return ra<rb;
  15.             };
  16.             sort(all(sa),cmp);
  17.             tmp[sa[0]] = 0;
  18.             for(int i = 1; i < n; i++) tmp[sa[i]] = tmp[sa[i-1]] + cmp(sa[i-1],sa[i]);
  19.             for(int i = 0; i < n; i++) rk[i] = tmp[i];
  20.         }
  21.     }
  22. };
Advertisement
Add Comment
Please, Sign In to add comment