fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5.  
  6. const int MaxN = 1e4;
  7.  
  8. bool can[MaxN + 1][4];
  9.  
  10. int main(int argc, const char * argv[]) {
  11. string s;
  12. cin >> s;
  13. int n = (int)s.length();
  14. can[n][2] = true;
  15. can[n][3] = true;
  16. for (int i = n - 1; i >= 5; --i) {
  17. for (int j = 2; j <= 3; ++j) {
  18. if (i + j > n) continue;
  19.  
  20. string nxt = "";
  21. if (i + j != n)
  22. nxt = s.substr(i + j, j);
  23. if (can[i + j][5 - j] || (can[i + j][j] && nxt != s.substr(i, j))) {
  24. can[i][j] = true;
  25. }
  26. }
  27. }
  28.  
  29. vector<string> ans;
  30.  
  31. for (int i = 5; i < n; ++i)
  32. for (int j = 2; j <= 3; ++j) {
  33. if (i + j <= n && can[i][j]) {
  34. ans.push_back(s.substr(i, j));
  35. }
  36. }
  37.  
  38. sort(ans.begin(), ans.end());
  39. ans.resize(unique(ans.begin(), ans.end()) - ans.begin());
  40. cout << ans.size() << endl;
  41. for (int i = 0; i < (int)ans.size(); ++i) {
  42. cout << ans[i] << endl;
  43. }
  44. return 0;
  45. }
Success #stdin #stdout 0s 16112KB
stdin
abacabaca
stdout
3
aca
ba
ca