#include <bits/stdc++.h>
using namespace std;
vector<int> z_function(int N, char s[]) {
  vector<int> z(N);
  for (int i = 1, L = 0, R = 0; i < N; ++i) {
    int k = 0;
    if (i <= R) k = min(R - i + 1, z[i - L]);
    while (i + k < N && s[k] == s[i + k]) ++k;
    if (i + k - 1 > R) L = i, R = i + k - 1;
    z[i] = k;
  }
  z[0] = N;
  return z;
}
const int INF = 1000000;
inline int num_digits(int num) {
  if (num < 10) return 1;
  if (num < 100) return 2;
  if (num < 1000) return 3;
  if (num < 10000) return 4;
  return 9;
}
int N;
char S[8004];
vector<int> divisors[8004];
int get_cost(const vector<int>& Z, int len) {
  int best_cost = 1 + len;
  for (int d : divisors[len]) {
    if (Z[d] >= len - d) {
      int cnt = len / d;
      int cost = num_digits(cnt) + d;
      if (cost >= best_cost) break;
      best_cost = cost;
    }
  }
  return best_cost;
}
int DP[8004];
int solve() {
  for (int n = 1; n <= N; ++n) {
    for (int d = 1; d * d <= N; ++d) {
      if ((n % d) == 0) {
        divisors[n].push_back(d);
        int y = n / d;
        if (y != d) divisors[n].push_back(y);
      }
    }
    sort(divisors[n].begin(), divisors[n].end());
  }
  S[N] = '$';
  S[N + 1] = 0;
  for (int i = (1), _b = (N); i <= _b; ++i) DP[i] = INF;
  DP[0] = 0;
  for (int start = 0, _n = (N); start < _n; ++start) {
    vector<int> Z = z_function(N - start + 1, S + start);
    for (int end = (start + 1), _b = (N); end <= _b; ++end) {
      int cost = get_cost(Z, end - start);
      DP[end] = min(DP[end], DP[start] + cost);
    }
  }
  return DP[N];
}
int main(int argc, char* argv[]) {
  scanf("%s", S);
  N = strlen(S);
  assert(N <= 8000);
  long long res = solve();
  printf("%lld\n", res);
  return 0;
}
