1 #include <cstdio>
2 #include <cstring>
3 #include <cstdlib>
4 #include <iostream>
5 #include <set>
6 #include <map>
7 #include <queue>
8 #include <vector>
9 #include <utility>
10 #include <algorithm>
11 #define MAXN 8005
12 #define INF 0x3f3f3f3f
13 #define DEBUG
14 #define DataIn
15 typedef long long LL;
16
17 using namespace std;
18 int nex[MAXN];
19 char s[MAXN];
20 int len;
21 int dp[MAXN];
22 int a[MAXN][MAXN];
23
24
25 void prekmp(char x[])
26 {
27 int i = 0, j = -1;
28 nex[0] = -1;
29 while(i < len)
30 {
31 // while(j!=-1 && x[i]!=x[j])
32 // j = nex[j];
33 // nex[++i] = ++j;
34 if(j == -1 || x[i] == x[j])
35 nex[++i] = ++j;
36 else
37 j = nex[j];
38 }
39 for(int i=0;i<=len;i++)cout<<nex[i]<<" ";cout<<endl;
40 }
41 int digitcnt(int k)
42 {
43 int cnt = 0;
44 while(k)
45 {
46 k /= 10;
47 cnt++;
48 }
49 return cnt;
50 }
51
52 void init()
53 {
54 for(int i = 0; i < len; i++)
55 {
56 prekmp(s + i);
57 for(int j = i; j < len; j++)
58 {
59 int t1 = j - i + 1, t2 = t1 - nex[t1];
60 a[i][j] = t1 % t2 == 0 ? t2 + digitcnt(t1/t2) : t1 + 1;
61 }
62 }
63 }
64
65 int main()
66 {
67 scanf("%s", s);
68 len = strlen(s);
69 fill(dp, dp+len, INF);
70 init();
71 dp[0] = 2;
72 for(int i = 1; i < len;i ++)
73 {
74 dp[i] = a[0][i];
75 for(int j = 0; j < i; j ++)
76 dp[i] = min(dp[i],dp[j] + a[j + 1][i]);
77 }
78 for(int i=0;i<len;i++)cout<<dp[i]<<endl;
79 printf("%d\n",dp[len-1]);
80 return 0;
81 }