gt22

10C

Dec 7th, 2019
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <vector>
  2. #include "optimization.h"
  3. #include <cmath>
  4. #include <cstring>
  5. #include <cassert>
  6. using namespace std;
  7. char s[101], g[101];
  8. int lcp[101][101] = {};
  9. int ans[101][101] = {};
  10. pair<int, int> p[101][101];
  11. int get_lcp(size_t i, size_t j) {
  12.     if(lcp[i][j] == -1) {
  13.         if(s[i] == 0 || s[j] == 0 || s[i] != s[j]) {
  14.             lcp[i][j] = 0;
  15.         } else {
  16.             lcp[i][j] = get_lcp(i+1, j+1) + 1;
  17.         }
  18.     }
  19.     return lcp[i][j];
  20. }
  21.  
  22. void fill_lcp(size_t n) {
  23.     for (auto &row : lcp) {
  24.         for (int &item : row) {
  25.             item = -1;
  26.         }
  27.     }
  28.     for (int i = 0; i <= n; ++i) {
  29.         for(size_t j = 0; j <= n; j++) {
  30.             get_lcp(i, j);
  31.         }
  32.     }
  33.  
  34. }
  35.  
  36. bool relax(int& a, int v) {
  37.     if(a > v) {
  38.         a = v;
  39.         return true;
  40.     }
  41.     return false;
  42. }
  43.  
  44. int length(int k) {
  45.     if(k == 0) return 1;
  46.     int ret = 0;
  47.     while(k > 0) {
  48.         ret++;
  49.         k /= 10;
  50.     }
  51.     return ret;
  52. }
  53.  
  54. int get_ans(int i, int len) {
  55.     if(ans[i][len] == -1) {
  56.         ans[i][len] = len;
  57.         p[i][len] = {-1, 0};
  58.         for(int m = 1; m < len; m++) {
  59.             if(relax(ans[i][len], get_ans(i, m) + get_ans(i+m, len-m))) {
  60.                 p[i][len] = {0, m};
  61.             }
  62.             if (len % m == 0 && lcp[i][i + m] >= len - m) {
  63.                 if(relax(ans[i][len], length(len / m) + get_ans(i, m) + 2)) {
  64.                     p[i][len] = {1, m};
  65.                 }
  66.             }
  67.         }
  68.     }
  69.     return ans[i][len];
  70. }
  71.  
  72. void restore(int i, int len, int o) {
  73.     auto [type, m] = p[i][len];
  74.     if(type == -1) {
  75.         for(int j = 0; j < len; j++) {
  76.             g[o+j] = s[i+j];
  77.         }
  78.     } else if(type == 0) {
  79.         int a = get_ans(i, m);
  80.         restore(i, m, o);
  81.         restore(i+m, len-m, o+a);
  82.     } else if(type == 1) {
  83.         int count = len / m;
  84.         int clen = length(count);
  85.         for(int k = clen - 1; k >= 0; k--) {
  86.             g[o + k] = (char) ('0' + (count % 10));
  87.             count /= 10;
  88.         }
  89.         g[o+clen] = '(';
  90.         restore(i, m, o+clen+1);
  91.         g[o+clen+1+get_ans(i, m)] = ')';
  92.     } else {
  93.         assert(false);
  94.     }
  95. }
  96.  
  97. int main() {
  98.     readWord(s);
  99.     size_t n = strlen(s);
  100.     fill_lcp(n);
  101.     for (auto &row : ans) {
  102.         for(auto &item : row) {
  103.             item = -1;
  104.         }
  105.     }
  106.     get_ans(0, n);
  107.     restore(0, n, 0);
  108.     writeWord(g);
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment