#include <bits/stdc++.h>
using namespace std;
const int maxn = 8e3 + 10, INF = 0x7f7f7f7f;
template <typename T>
void read(T &x) {
  x = 0;
  char c = getchar();
  int f = 1;
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = -1;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
  x *= f;
}
char s[maxn];
int dp[maxn], f[maxn], n;
int cal(int x) {
  int ans = 0;
  for (int i = x; i; i /= 10) ans++;
  return ans;
}
int nxt[maxn], t[maxn];
void get_nxt(int l, int r) {
  int m = r - l + 1;
  nxt[l] = 0;
  for (int i = 1, j = 0; i < m; i++) {
    while (j && s[i + l] != s[j + l]) j = nxt[j + l - 1];
    if (s[i + l] == s[j + l]) j++;
    nxt[i + l] = j;
  }
}
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  for (int i = 1; i <= n; i++) {
    f[i] = f[i / 10] + 1;
    dp[i] = i + 1;
  }
  for (int i = 1; i <= n; i++) {
    get_nxt(i, n);
    for (int j = i; j <= n; j++) {
      int len = j - i + 1;
      int d = len - nxt[j];
      if (len % d)
        dp[j] = min(dp[j], dp[i - 1] + len + f[1]);
      else
        dp[j] = min(dp[j], dp[i - 1] + d + f[len / d]);
    }
  }
  printf("%d\n", dp[n]);
  return 0;
}
