suffix.cpp 1.1 KB

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