Advertisement
deushiro

Untitled

Jan 13th, 2020
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. typedef long long ll;
  7.  
  8. vector<vector<int>> dp;
  9. vector<vector<int>> pos;
  10. vector<ll> p;
  11. vector<ll> h;
  12.  
  13. string s;
  14.  
  15. const ll mod = 1e9 + 7;
  16.  
  17. int solve(int l, int r){
  18.     int a = s[r] - 'a';
  19.     int left = 0;
  20.     int right = pos[a].size();
  21.     while(right - left > 1){
  22.         int m = (left + right) / 2;
  23.         if(pos[a][m] >= l){
  24.             right = m;
  25.         }
  26.         else{
  27.             left = m;
  28.         }
  29.     }
  30.     if(pos[a][left] >= l)
  31.         right = left;
  32.     for(int i = right; i < pos[a].size(); ++i){
  33.         if(pos[a][i] >= l && pos[a][i] < (l + r + 1) / 2){
  34.             int len = pos[a][i] - l + 1;
  35.             ll h1 = h[l + len - 1] + mod;
  36.             if(l - 1 >= 0)
  37.                 h1 -= h[l - 1];
  38.             ll h2 = h[r] + mod - h[r - len];
  39.             if((h1 * p[r - len + 1 - l]) % mod == h2 % mod)
  40.                 return(len);
  41.         }
  42.     }
  43.     return 0;
  44. }
  45.  
  46.  
  47. int f(int l, int r){
  48.     if(l == r){
  49.         return 1;
  50.     }
  51.     if(dp[l][r] != 0){
  52.         return(dp[l][r]);
  53.     }
  54.     int x = solve(l, r);
  55.     if(x == 0){
  56.         dp[l][r] = r - l + 1;
  57.     }
  58.     else{
  59.         dp[l][r] = min(f(l + x, r), f(l, r - x));
  60.     }
  61.     return(dp[l][r]);
  62. }
  63.  
  64. int main() {
  65.     cin >> s;
  66.     if(s.size() == 1){
  67.         cout << 1 << endl;
  68.         return 0;
  69.     }
  70.     int n = s.size();
  71.     h.resize(n);
  72.     p.resize(n);
  73.     pos.resize(26, vector<int>());
  74.     for(int i = 0; i < n; ++i){
  75.         pos[s[i] - 'a'].push_back(i);
  76.     }
  77.     h[0] = (s[0] - 'a' + 1);
  78.     p[0] = 1 * 1LL;
  79.     for(int i = 1; i < n; ++i){
  80.         p[i] = p[i - 1] * 29 * 1LL;
  81.         p[i] %= mod;
  82.     }
  83.     for(int i = 1; i < n; ++i){
  84.         h[i] = h[i - 1] + (s[i] - 'a' + 1) * p[i] * 1LL;
  85.         h[i] %= mod;
  86.     }
  87.     dp.resize(s.size(), vector<int>(s.size()));
  88.     f(0, s.size() - 1);
  89.     cout << dp[0][s.size() - 1] << "\n";
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement