#include <bits/stdc++.h>
using namespace std;
int dp[100];
int t;
string s;
// Implementation of KMP taken from stackoverflow
int KMP(string S, string K)
{
vector<int> T(K.size() + 1, -1);
vector<int> matches;
if(K.size() == 0)
{
matches.push_back(0);
return 0;
}
for(int i = 1; i <= K.size(); i++)
{
int pos = T[i - 1];
while(pos != -1 && K[pos] != K[i - 1]) pos = T[pos];
T[i] = pos + 1;
}
int sp = 0;
int kp = 0;
while(sp < S.size())
{
while(kp != -1 && (kp == K.size() || K[kp] != S[sp])) kp = T[kp];
kp++;
sp++;
if(kp == K.size()) matches.push_back(sp - K.size());
}
return matches.size();
}
bool searcher(int pos,int p1,int p2)
{
string s1,s2;
for(int i=0; i<=pos; i++)
s1+=s[i];
for(int i=p1; i<=p2; i++)
s2+=s[i];
return KMP(s1,s2)>0;
}
void solve(void)
{
for(int i=0; i<100; i++)
dp[i]=i+1;
dp[0]=1;
for(int i=0; i<s.length()-1; i++)
{
dp[i+1]=min(dp[i+1],dp[i]+1);
for(int j=1; i+j<s.length()&&j<=(i+1); j++)
{
if(searcher(i,i+1,i+j))
{
// cout << i << " " << j << endl;
for(int k=i+1; k<s.length(); k++)
{
if(s[k]==s[i+1+(k-i-1)%j])
{
if((k-i)%j==0)
dp[k]=min(dp[k],dp[i]+1+(k-i)/j);
}
else
break;
}
}
else
break;
}
}
}
int main()
{
// freopen("input.in", "r", stdin);
// freopen("output.out", "w", stdout);
cin >> t;
for(int i=1; i<=t; i++)
{
cin >> s;
solve();
cout << s << endl;
printf("Case #%d: %d\n",i,dp[s.length()-1]);
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgZHBbMTAwXTsKaW50IHQ7CnN0cmluZyBzOwoKLy8gSW1wbGVtZW50YXRpb24gb2YgS01QIHRha2VuIGZyb20gc3RhY2tvdmVyZmxvdwppbnQgS01QKHN0cmluZyBTLCBzdHJpbmcgSykKewogICAgdmVjdG9yPGludD4gVChLLnNpemUoKSArIDEsIC0xKTsKICAgIHZlY3RvcjxpbnQ+IG1hdGNoZXM7CgogICAgaWYoSy5zaXplKCkgPT0gMCkKICAgIHsKICAgICAgICBtYXRjaGVzLnB1c2hfYmFjaygwKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gSy5zaXplKCk7IGkrKykKICAgIHsKICAgICAgICBpbnQgcG9zID0gVFtpIC0gMV07CiAgICAgICAgd2hpbGUocG9zICE9IC0xICYmIEtbcG9zXSAhPSBLW2kgLSAxXSkgcG9zID0gVFtwb3NdOwogICAgICAgIFRbaV0gPSBwb3MgKyAxOwogICAgfQoKICAgIGludCBzcCA9IDA7CiAgICBpbnQga3AgPSAwOwogICAgd2hpbGUoc3AgPCBTLnNpemUoKSkKICAgIHsKICAgICAgICB3aGlsZShrcCAhPSAtMSAmJiAoa3AgPT0gSy5zaXplKCkgfHwgS1trcF0gIT0gU1tzcF0pKSBrcCA9IFRba3BdOwogICAgICAgIGtwKys7CiAgICAgICAgc3ArKzsKICAgICAgICBpZihrcCA9PSBLLnNpemUoKSkgbWF0Y2hlcy5wdXNoX2JhY2soc3AgLSBLLnNpemUoKSk7CiAgICB9CgogICAgcmV0dXJuIG1hdGNoZXMuc2l6ZSgpOwp9CmJvb2wgc2VhcmNoZXIoaW50IHBvcyxpbnQgcDEsaW50IHAyKQp7CiAgICBzdHJpbmcgczEsczI7CiAgICBmb3IoaW50IGk9MDsgaTw9cG9zOyBpKyspCiAgICAgICAgczErPXNbaV07CiAgICBmb3IoaW50IGk9cDE7IGk8PXAyOyBpKyspCiAgICAgICAgczIrPXNbaV07CiAgICByZXR1cm4gS01QKHMxLHMyKT4wOwp9CnZvaWQgc29sdmUodm9pZCkKewoKICAgIGZvcihpbnQgaT0wOyBpPDEwMDsgaSsrKQogICAgICAgIGRwW2ldPWkrMTsKICAgIGRwWzBdPTE7CiAgICBmb3IoaW50IGk9MDsgaTxzLmxlbmd0aCgpLTE7IGkrKykKICAgIHsKICAgICAgICBkcFtpKzFdPW1pbihkcFtpKzFdLGRwW2ldKzEpOwogICAgICAgIGZvcihpbnQgaj0xOyBpK2o8cy5sZW5ndGgoKSYmajw9KGkrMSk7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKHNlYXJjaGVyKGksaSsxLGkraikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvdXQgPDwgaSA8PCAiICIgPDwgaiA8PCBlbmRsOwogICAgICAgICAgICAgICAgZm9yKGludCBrPWkrMTsgazxzLmxlbmd0aCgpOyBrKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYoc1trXT09c1tpKzErKGstaS0xKSVqXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChrLWkpJWo9PTApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcFtrXT1taW4oZHBba10sZHBbaV0rMSsoay1pKS9qKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KaW50IG1haW4oKQp7Ci8vICAgZnJlb3BlbigiaW5wdXQuaW4iLCAiciIsIHN0ZGluKTsKICAgIC8vICBmcmVvcGVuKCJvdXRwdXQub3V0IiwgInciLCBzdGRvdXQpOwogICAgY2luID4+IHQ7CiAgICBmb3IoaW50IGk9MTsgaTw9dDsgaSsrKQogICAgewogICAgICAgIGNpbiA+PiBzOwogICAgICAgIHNvbHZlKCk7CiAgICAgICAgY291dCA8PCBzIDw8IGVuZGw7CiAgICAgICAgcHJpbnRmKCJDYXNlICMlZDogJWRcbiIsaSxkcFtzLmxlbmd0aCgpLTFdKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==