fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. string s;
  5. unordered_map<string,string> memo;
  6.  
  7. bool isRepeat(const string &t, string &sub, int &cnt) {
  8. int n = t.size();
  9. for (int len = 1; len <= n/2; len++) {
  10. if (n % len != 0) continue;
  11. string x = t.substr(0, len);
  12. bool ok = true;
  13. for (int i = len; i < n; i += len) {
  14. if (t.substr(i, len) != x) { ok = false; break; }
  15. }
  16. if (ok) {
  17. sub = x;
  18. cnt = n / len;
  19. return true;
  20. }
  21. }
  22. return false;
  23. }
  24.  
  25. string solve(string t) {
  26. if (memo.count(t)) return memo[t];
  27. int n = t.size();
  28. if (n == 0) return "";
  29. if (n == 1) return t;
  30.  
  31. string best = t; // raw
  32.  
  33. // thử nén bằng dạng k(sub)
  34. string sub;
  35. int cnt;
  36. if (isRepeat(t, sub, cnt)) {
  37. string subEnc = solve(sub);
  38. string cand = to_string(cnt) + "(" + subEnc + ")";
  39. if (cand.size() < best.size()) best = cand;
  40. }
  41.  
  42. // thử cắt t thành 2 phần bất kì và nén riêng từng phần
  43. for (int i = 1; i < n; i++) {
  44. string left = solve(t.substr(0, i));
  45. string right = solve(t.substr(i));
  46. string cand = left + right;
  47. if (cand.size() < best.size()) best = cand;
  48. }
  49.  
  50. return memo[t] = best;
  51. }
  52.  
  53. int main() {
  54. freopen("wstring.inp", "r", stdin);
  55. freopen("wstring.out", "w", stdout);
  56. int n; cin >> n;
  57. cin >> s;
  58. cout << solve(s);
  59. }
  60.  
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Standard output is empty