#include<cstdio>//考试时对题面进行了亿些魔改导致代码有些奇怪,会用qwq标记
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<set>
using namespace std;
int n,ans,dp[505][505],M[505][505];//qwq//dp[i][j]表示截至第i个字符,最右边一个M在j后面的最小长度
char A[505],a[505];//qwq
string k[505][505];//qwq
int main () {
while (cin>>A) {//qwq
n=strlen(A);
for (int i=1;i<=n;i++) {
a[i]=A[i-1];
}
for (int i=1;i<=n;i++) {
string t="";
for (int j=i;j<=n;j++) {
t+=a[j];
k[i][j-i+1]=t;
}
}
memset(dp,127,sizeof(dp));
memset(M,127,sizeof(M));//M[i][j]表示dp[i][0]到dp[i][j]的最小值
dp[0][0]=0;
for (int i=1;i<=n;i++) {
dp[i][0]=dp[i-1][0]+1;
for (int j=1;j<i-1;j++) {
dp[i][j]=min(dp[i-1][j]+1,M[i-1][j]+2);
}
if (i!=1) dp[i][i-1]=M[i-1][i-2]+2;
else dp[i][i-1]=1;
for (int s=2;s<=i;s+=2) {
if (k[i-s+1][s/2]==k[i-s+1+s/2][s/2]) dp[i][i-s]=min(dp[i][i-s],dp[i-s+s/2][i-s]+1);//判断插入R的情况
}
M[i][0]=dp[i][0];
for (int j=1;j<i;j++) {
M[i][j]=min(M[i][j-1],dp[i][j]);
}
}
ans=1e9;
for (int i=0;i<n;i++) {
ans=min(ans,dp[n][i]);
}
printf("%d\n",ans);
}
return 0;
}