suffix.cpp 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. const int LOG_INF = 17;
  2. void suffix_tree(string s, int p[LOG_INF][inf], int &k) {
  3. int N = s.length();
  4. for(int i = 0 ; i < N ; i++)
  5. p[0][i] = s[i] - 'a';
  6. // copy(p[0], p[0] + N, ostream_iterator<int>(cout, " "));
  7. // cout << endl;
  8. tuple<int, int, int> v[inf];
  9. k = 0;
  10. for(int shift = 1 ; shift >> 1 < N ; shift <<= 1) {
  11. k++;
  12. for(int i = 0 ; i < N ; i++)
  13. v[i] = make_tuple(p[k - 1][i], (i + shift < N) ? p[k - 1][i + shift] : -1, i);
  14. sort(v, v + N);
  15. for(int i = 0 ; i < N ; i++)
  16. p[k][get<2>(v[i])] = (i > 0 && get<0>(v[i]) == get<0>(v[i - 1])
  17. && get<1>(v[i]) == get<1>(v[i - 1])) ? p[k][get<2>(v[i - 1])] : i;
  18. // copy(p[k], p[k] + N, ostream_iterator<int>(cout, " "));
  19. // cout << endl;
  20. }
  21. }
  22. void lcp(int x, int y) {
  23. }
  24. int main() {
  25. string s;
  26. cin >> s;
  27. int k, p[LOG_INF][inf];
  28. suffix_tree(s, p, k);
  29. int w[inf];
  30. for(int i = 0 ; i < s.length() ; i++)
  31. w[p[k][i]] = i;
  32. for(int i = 0 ; i < s.length() ; i++)
  33. cout << w[i] << " ";
  34. cout << endl;
  35. for(int i = 0 ; i < s.length() ; i++)
  36. cout << s.substr(w[i]) << endl;
  37. }