#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for (int i = (a), _b = (b); i <= (_b); ++i)
#define FORD(i,a,b) for (int i = (a), _b = (b); i >= (_b); --i)
#define REP(i, n) for (int i = (0), _n = (n); i < _n; ++i)
#define getBit(mask,i) (((mask) >> (i)) & (1LL))
#define MASK(x) (1LL << (x))
#define allof(x) begin(x), end(x)
#define el cout << '\n';
//--Compare------------------------------------------------------------------------------------
template<class X, class Y>
inline bool maximize(X &x, const Y &y){ return (x < y) ? x = y, 1 : 0; }
template<class X, class Y>
inline bool minimize(X &x, const Y &y){ return (x > y) ? x = y, 1 : 0; }
//--Process------------------------------------------------------------------------------------
// #define int long long
string S;
int n;
void loadInput(void)
{
cin >> S;
n = S.size();
}
namespace subtask2
{
int dp[363][363];
int dfs(int l, int r)
{
if (l >= r) return 1;
if (dp[l][r] != -1) return dp[l][r];
int res = (S[l] == S[r] ? dfs(l + 1, r - 1) : 3636);
FOR(k, l, r - 1) minimize(res, dfs(l, k) + dfs(k + 1, r));
return dp[l][r] = res;
}
bool solve()
{
memset(dp, -1, sizeof dp);
cout << dfs(0, n - 1) << '\n';
return cerr << "2\n", true;
}
}
signed main(void)
{
cin.tie(nullptr)->sync_with_stdio(false);
cin.exceptions(cin.failbit);
int T; cin >> T;
while (T--)
{
loadInput();
// if (subtask1::solve()) continue;
if (subtask2::solve()) continue;
}
cerr << (1.0 * clock() / CLOCKS_PER_SEC);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBGT1IoaSxhLGIpICAgICAgZm9yIChpbnQgaSA9IChhKSwgX2IgPSAoYik7IGkgPD0gKF9iKTsgKytpKQojZGVmaW5lIEZPUkQoaSxhLGIpICAgICBmb3IgKGludCBpID0gKGEpLCBfYiA9IChiKTsgaSA+PSAoX2IpOyAtLWkpCiNkZWZpbmUgUkVQKGksIG4pICAgICAgICBmb3IgKGludCBpID0gKDApLCBfbiA9IChuKTsgaSA8IF9uOyArK2kpCiNkZWZpbmUgZ2V0Qml0KG1hc2ssaSkgICgoKG1hc2spID4+IChpKSkgJiAoMUxMKSkKI2RlZmluZSBNQVNLKHgpICAgICAgICAgICAgKDFMTCA8PCAoeCkpCiNkZWZpbmUgYWxsb2YoeCkgICAgICAgIGJlZ2luKHgpLCBlbmQoeCkKI2RlZmluZSBlbCAgICAgICAgICAgICAgY291dCA8PCAnXG4nOwoKLy8tLUNvbXBhcmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWT4gCiAgICBpbmxpbmUgYm9vbCBtYXhpbWl6ZShYICZ4LCBjb25zdCBZICZ5KXsgcmV0dXJuICh4IDwgeSkgPyB4ID0geSwgMSA6IDA7IH0KCnRlbXBsYXRlPGNsYXNzIFgsIGNsYXNzIFk+IAogICAgaW5saW5lIGJvb2wgbWluaW1pemUoWCAmeCwgY29uc3QgWSAmeSl7IHJldHVybiAoeCA+IHkpID8geCA9IHksIDEgOiAwOyB9CgovLy0tUHJvY2Vzcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gI2RlZmluZSBpbnQgICAgICAgICAgICAgbG9uZyBsb25nCgpzdHJpbmcgUzsKaW50IG47Cgp2b2lkIGxvYWRJbnB1dCh2b2lkKQp7CiAgICBjaW4gPj4gUzsKICAgIG4gPSBTLnNpemUoKTsKfQoKbmFtZXNwYWNlIHN1YnRhc2syCnsKICAgIGludCBkcFszNjNdWzM2M107CgogICAgaW50IGRmcyhpbnQgbCwgaW50IHIpCiAgICB7CiAgICAgICAgaWYgKGwgPj0gcikgcmV0dXJuIDE7CiAgICAgICAgaWYgKGRwW2xdW3JdICE9IC0xKSByZXR1cm4gZHBbbF1bcl07CgogICAgICAgIGludCByZXMgPSAoU1tsXSA9PSBTW3JdID8gZGZzKGwgKyAxLCByIC0gMSkgOiAzNjM2KTsKICAgICAgICBGT1IoaywgbCwgciAtIDEpIG1pbmltaXplKHJlcywgZGZzKGwsIGspICsgZGZzKGsgKyAxLCByKSk7CgogICAgICAgIHJldHVybiBkcFtsXVtyXSA9IHJlczsKICAgIH0KCiAgICBib29sIHNvbHZlKCkKICAgIHsKCiAgICAgICAgbWVtc2V0KGRwLCAtMSwgc2l6ZW9mIGRwKTsKCiAgICAgICAgY291dCA8PCBkZnMoMCwgbiAtIDEpIDw8ICdcbic7CgogICAgICAgIHJldHVybiBjZXJyIDw8ICIyXG4iLCB0cnVlOwogICAgfQp9CgpzaWduZWQgbWFpbih2b2lkKQp7CiAgICBjaW4udGllKG51bGxwdHIpLT5zeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLmV4Y2VwdGlvbnMoY2luLmZhaWxiaXQpOwogICAgCiAgICBpbnQgVDsgY2luID4+IFQ7CiAgICB3aGlsZSAoVC0tKSAKICAgIHsKICAgICAgICBsb2FkSW5wdXQoKTsKCiAgICAgICAgLy8gaWYgKHN1YnRhc2sxOjpzb2x2ZSgpKSBjb250aW51ZTsKICAgICAgICBpZiAoc3VidGFzazI6OnNvbHZlKCkpIGNvbnRpbnVlOwogICAgfQoKICAgIGNlcnIgPDwgKDEuMCAqIGNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQyk7CiAgICByZXR1cm4gMDsKfQo=