#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
struct Sync_stdio {
  Sync_stdio() {
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
  }
} _sync_stdio;
struct FAIL {
  FAIL() {
    cout << "CHANGE!!!"
         << "\n";
  }
};
vector<int> z_function(const string &s) {
  int n = s.size();
  vector<int> z(n);
  for (int i = 1, l = 0, r = 0; i < n; ++i) {
    if (i <= r) {
      z[i] = min(r - i + 1, z[i - l]);
    }
    while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {
      ++z[i];
    }
    if (i + z[i] - 1 > r) {
      l = i, r = i + z[i] - 1;
    }
  }
  return z;
}
int main() {
  const int MAX = 2e4;
  string s;
  cin >> s;
  int n = s.size();
  vector<vector<int>> best(n, vector<int>(n, MAX));
  vector<vector<int>> z(n);
  for (int i = (0); i < (n); ++i) {
    z[i] = z_function(s.substr(i, s.size() - i));
  }
  for (int i = (0); i < (n); ++i) {
    for (int j = (i); j < (n); ++j) {
      int pos = j == n - 1 ? 0 : z[i][j - i + 1];
      int add = 1;
      int cur = 1;
      int nxt = 10;
      for (int k = 0; k <= pos; k += j - i + 1) {
        best[i][j + k] = min(best[i][j + k], add + (j - i + 1));
        ++cur;
        if (cur == nxt) {
          nxt *= 10;
          ++add;
        }
      }
    }
  }
  vector<int> dp(n + 1, MAX);
  dp[0] = 0;
  for (int i = (0); i < (n); ++i) {
    for (int j = (0); j < (i + 1); ++j) {
      dp[i + 1] = min(dp[i + 1], dp[j] + best[j][i]);
    }
  }
  cout << dp[n];
}
