#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T bigmod(T p, T e, T M) {
  long long int ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p) % M;
    p = (p * p) % M;
  }
  return (T)ret;
}
template <class T>
inline T gcd(T a, T b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
template <class T>
inline T modinverse(T a, T M) {
  return bigmod(a, M - 2, M);
}
template <class T>
inline T bpow(T p, T e) {
  long long int ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p);
    p = (p * p);
  }
  return (T)ret;
}
int toInt(string s) {
  int sm;
  stringstream ss(s);
  ss >> sm;
  return sm;
}
int toLlint(string s) {
  long long int sm;
  stringstream ss(s);
  ss >> sm;
  return sm;
}
int ts, kk = 1;
int n;
char s[8005];
int c[8005];
void kmp(char b[], int ls[]) {
  int i, k;
  for (i = 1, k = 0, ls[0] = 0; b[i] != '\0'; i++) {
    while (k && b[k] != b[i]) k = ls[k - 1];
    if (b[k] == b[i]) k++;
    ls[i] = k;
  }
  ls[0] = 1;
  for (i = 1; b[i]; i++) {
    ls[i] = i + 1 - ls[i];
    if ((i + 1) % ls[i]) ls[i] = i + 1;
  }
}
int ls[8005][8005];
long long int p[8005];
int main() {
  int t, i, j, k;
  scanf("%s", s);
  n = strlen(s);
  for (i = 0; i < n; i++) {
    kmp(s + i, ls[i] + i);
    t = i;
    c[i] = 0;
    while (t) c[i]++, t /= 10;
  }
  t = i;
  c[i] = 0;
  while (t) c[i]++, t /= 10;
  i++;
  t = i;
  c[i] = 0;
  while (t) c[i]++, t /= 10;
  p[n] = 0;
  for (i = n - 1; i > -1; i--) {
    p[i] = (1LL << 50);
    for (j = i; j < n; j++) {
      p[i] = min(p[i], p[j + 1] + ls[i][j] + c[(j - i + 1) / ls[i][j]]);
    }
  }
  printf("%d\n", p[0]);
  return 0;
}
