#include<bits/stdc++.h>
using namespace std;
//#include <boost/multiprecision/cpp_int.hpp>
//using namespace boost::multiprecision;
#define fio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#pragma GCC optimize "trapv"
#define _GLIBCXX_DEBUG
#define ll long long int
#define ld long double
#define ull unsigned long long int // ranges from (0 - twice of long long int)
#define rep(i,a,n) for (ll i=a;i<n;i++)
#define per(i,a,n) for (ll i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define vll vector<ll>
#define mod 1000000007LL
#define llpair pair<ll,ll>
#define INF 1000000000000000000ll
#define np next_permutation
#define PI acos(-1)
#define deb(x) cout<<#x<<" "<<x<<endl;
#define rotate_left(vec,amt) rotate(vec.begin(),vec.begin()+amt,vec.end());
#define rotate_right(vec,amt) rotate(vec.begin(),vec.begin()+vec.size()-amt,vec.end());
#define all(x) x.begin(),x.end()
#define sortall(x) sort(all(x))
#define clr0(x) memset(x,0,sizeof(x))
#define clr1(x) memset(x,-1,sizeof(x))
ll static dp[1001][1001]; //create a dp table according to constraints.
bool static pal[1001][1001]; // create table to answer i to j is palindrome or not;
// step 1
ll palindrome_partition(string s,ll i, ll j)
{
if(i>j) // means the gives strings having ends i and j are empty // first invalid condition.
return 0; // it means we no more cuts required.
if(dp[i][j]!=-1) return dp[i][j]; // step 3
//if(is_palindrome(s,i,j))
//return 0; // already is palidrome so no more cost/cuts is required
// or we can say no of cuts required is 0.
if(pal[i][j]) return 0; // if already a palindromic subsequence then return cost to be 0
ll mina=INT_MAX;
for(ll k=i;k<=j-1;k++)
{
ll tempans=palindrome_partition(s,i,k) +
palindrome_partition(s,k+1,j) + 1;// here 1 is for doing current cost to break i,j to (i to k) and (k+1 to j)
mina=min(mina,tempans);
}
return (dp[i][j]=mina);
}
int main() {
auto start = chrono::high_resolution_clock::now();
fio;
ll t=1;
cin>>t;
while(t--)
{
//ll n; cin>>n;
string s; cin>>s;
clr1(dp); // step 2, make dp table with -1;
clr0(pal);
ll n=s.length();
// code for finding palindromic substring
// code start
for(int i=0;i<n;i++)
pal[i][i]=1;
// explicitly for 2 length
for(int i=0;i<n-1;i++)
{
if(s[i]==s[i+1])
pal[i][i+1]=1;
}
for(int i=2;i<n;i++)
{
for(int j=0;j+i<n;j++)
{
if(s[j]==s[j+i] and pal[j+1][j+i-1]==1)
pal[j][j+i]=1;
}
}
// code ends/////
//for(int i=0;i<n;i++)
//{
//for(int j=0;j<n;j++)
//cout<<pal[i][j]<<" ";
//cout<<"\n";
//}
cout<<palindrome_partition(s,0,n-1)<<"\n";
}
auto finish = chrono::high_resolution_clock::now();
cerr << "Time elapsed: " << (chrono::duration<long double>(finish-start)).count() << "s\n";
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy8jaW5jbHVkZSA8Ym9vc3QvbXVsdGlwcmVjaXNpb24vY3BwX2ludC5ocHA+Ci8vdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjptdWx0aXByZWNpc2lvbjsKI2RlZmluZSBmaW8gaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUoTlVMTCk7IGNvdXQudGllKE5VTEwpOwojcHJhZ21hIEdDQyBvcHRpbWl6ZSAidHJhcHYiCiNkZWZpbmUgX0dMSUJDWFhfREVCVUcKI2RlZmluZSBsbCBsb25nIGxvbmcgaW50CiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nIGludCAgLy8gcmFuZ2VzIGZyb20gKDAgLSB0d2ljZSBvZiBsb25nIGxvbmcgaW50KQojZGVmaW5lIHJlcChpLGEsbikgZm9yIChsbCBpPWE7aTxuO2krKykKI2RlZmluZSBwZXIoaSxhLG4pIGZvciAobGwgaT1uLTE7aT49YTtpLS0pCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgdmxsIHZlY3RvcjxsbD4KI2RlZmluZSBtb2QgMTAwMDAwMDAwN0xMCiNkZWZpbmUgbGxwYWlyIHBhaXI8bGwsbGw+CiNkZWZpbmUgSU5GIDEwMDAwMDAwMDAwMDAwMDAwMDBsbAojZGVmaW5lIG5wIG5leHRfcGVybXV0YXRpb24KI2RlZmluZSBQSSBhY29zKC0xKQojZGVmaW5lIGRlYih4KSBjb3V0PDwjeDw8IiAiPDx4PDxlbmRsOwojZGVmaW5lIHJvdGF0ZV9sZWZ0KHZlYyxhbXQpIHJvdGF0ZSh2ZWMuYmVnaW4oKSx2ZWMuYmVnaW4oKSthbXQsdmVjLmVuZCgpKTsKI2RlZmluZSByb3RhdGVfcmlnaHQodmVjLGFtdCkgcm90YXRlKHZlYy5iZWdpbigpLHZlYy5iZWdpbigpK3ZlYy5zaXplKCktYW10LHZlYy5lbmQoKSk7CiNkZWZpbmUgYWxsKHgpIHguYmVnaW4oKSx4LmVuZCgpCiNkZWZpbmUgc29ydGFsbCh4KSBzb3J0KGFsbCh4KSkKI2RlZmluZSBjbHIwKHgpIG1lbXNldCh4LDAsc2l6ZW9mKHgpKQojZGVmaW5lIGNscjEoeCkgbWVtc2V0KHgsLTEsc2l6ZW9mKHgpKQoKCmxsIHN0YXRpYyBkcFsxMDAxXVsxMDAxXTsgLy9jcmVhdGUgYSBkcCB0YWJsZSBhY2NvcmRpbmcgdG8gY29uc3RyYWludHMuCmJvb2wgc3RhdGljIHBhbFsxMDAxXVsxMDAxXTsgLy8gY3JlYXRlIHRhYmxlIHRvIGFuc3dlciBpIHRvIGogaXMgcGFsaW5kcm9tZSBvciBub3Q7Ci8vIHN0ZXAgMQoKCmxsIHBhbGluZHJvbWVfcGFydGl0aW9uKHN0cmluZyBzLGxsIGksIGxsIGopCnsKCQoJaWYoaT5qKSAvLyBtZWFucyB0aGUgZ2l2ZXMgc3RyaW5ncyBoYXZpbmcgZW5kcyBpIGFuZCBqIGFyZSBlbXB0eSAgICAvLyBmaXJzdCBpbnZhbGlkIGNvbmRpdGlvbi4KCXJldHVybiAwOyAgLy8gaXQgbWVhbnMgd2Ugbm8gbW9yZSBjdXRzIHJlcXVpcmVkLiAKCQoJaWYoZHBbaV1bal0hPS0xKSByZXR1cm4gZHBbaV1bal07IC8vIHN0ZXAgMyAKCQoJLy9pZihpc19wYWxpbmRyb21lKHMsaSxqKSkKCS8vcmV0dXJuIDA7ICAvLyBhbHJlYWR5IGlzIHBhbGlkcm9tZSBzbyBubyBtb3JlIGNvc3QvY3V0cyBpcyByZXF1aXJlZAoJCQkJCQkgIC8vIG9yIHdlIGNhbiBzYXkgbm8gb2YgY3V0cyByZXF1aXJlZCBpcyAwLgoJCQkJCglpZihwYWxbaV1bal0pIHJldHVybiAwOyAgIC8vIGlmIGFscmVhZHkgYSBwYWxpbmRyb21pYyBzdWJzZXF1ZW5jZSB0aGVuIHJldHVybiBjb3N0IHRvIGJlIDAKCQkJCQoJbGwgbWluYT1JTlRfTUFYOwoJZm9yKGxsIGs9aTtrPD1qLTE7aysrKQoJewoJCWxsIHRlbXBhbnM9cGFsaW5kcm9tZV9wYXJ0aXRpb24ocyxpLGspICsKCQlwYWxpbmRyb21lX3BhcnRpdGlvbihzLGsrMSxqKSArIDE7Ly8gaGVyZSAxIGlzIGZvciBkb2luZyBjdXJyZW50IGNvc3QgdG8gYnJlYWsgaSxqIHRvIChpIHRvIGspIGFuZCAoaysxIHRvIGopCgkJCgkJbWluYT1taW4obWluYSx0ZW1wYW5zKTsKCX0KCQoJcmV0dXJuIChkcFtpXVtqXT1taW5hKTsKfQoKaW50IG1haW4oKSB7CiAgICBhdXRvIHN0YXJ0ID0gY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgZmlvOwogICAgbGwgdD0xOyAKICAgIGNpbj4+dDsgCiAgICB3aGlsZSh0LS0pCiAgICB7CgkJLy9sbCBuOyBjaW4+Pm47CgkJc3RyaW5nIHM7IGNpbj4+czsKCQljbHIxKGRwKTsgIC8vIHN0ZXAgMiwgbWFrZSBkcCB0YWJsZSB3aXRoIC0xOwoJCWNscjAocGFsKTsKCQlsbCBuPXMubGVuZ3RoKCk7CgkJCgkJCgkJLy8gY29kZSBmb3IgZmluZGluZyBwYWxpbmRyb21pYyBzdWJzdHJpbmcKCQkvLyBjb2RlIHN0YXJ0CgkJZm9yKGludCBpPTA7aTxuO2krKykKCQlwYWxbaV1baV09MTsKCQkKCQkvLyBleHBsaWNpdGx5IGZvciAyIGxlbmd0aAoJCWZvcihpbnQgaT0wO2k8bi0xO2krKykKCQl7CgkJCWlmKHNbaV09PXNbaSsxXSkKCQkJcGFsW2ldW2krMV09MTsKCQl9CgkJCgkJZm9yKGludCBpPTI7aTxuO2krKykKCQl7CgkJCWZvcihpbnQgaj0wO2oraTxuO2orKykKCQkJewoJCQkJaWYoc1tqXT09c1tqK2ldIGFuZCBwYWxbaisxXVtqK2ktMV09PTEpCgkJCQlwYWxbal1baitpXT0xOwoJCQl9CgkJfQoJCS8vIGNvZGUgZW5kcy8vLy8vCgkJLy9mb3IoaW50IGk9MDtpPG47aSsrKQoJCS8vewoJCQkvL2ZvcihpbnQgaj0wO2o8bjtqKyspCgkJCS8vY291dDw8cGFsW2ldW2pdPDwiICI7CgkJCS8vY291dDw8IlxuIjsKCQkvL30KCQkKCQljb3V0PDxwYWxpbmRyb21lX3BhcnRpdGlvbihzLDAsbi0xKTw8IlxuIjsKCX0KICAgIGF1dG8gZmluaXNoID0gY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgY2VyciA8PCAiVGltZSBlbGFwc2VkOiAiIDw8IChjaHJvbm86OmR1cmF0aW9uPGxvbmcgZG91YmxlPihmaW5pc2gtc3RhcnQpKS5jb3VudCgpIDw8ICJzXG4iOwogICAgcmV0dXJuIDA7CiAgICAgICAgICAgIAp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==
MQomcXVvdDthcGplc2dwc3hvZWlva21xbWZndmpzbGNqdWticXhwc29ieWhqcGJnZGZydXFka2Vpc3pybG10d2dmeHlmb3N0cHFjemlkZmxqd2ZiYnJmbGtnZHZ0eXRiZ3FhbGd1ZXduaHZ2bWNneGJveWNmZm9wbXRtaHRmaXp4a21lZnRjdWN4cG9ieG1lbG1qdHV6aWdzeG5uY3hwYWliZ3B1aWp3aGFua3hicGxweWVqeG1ycmpnZW9ldnFvendkdGdvc3BvaHpua295em9jamxyYWNjaGpxbmdnYmZlZWJtdXZiaWNidm1wdWxleXdycHp3c2loaXZucnd0eGN1a3dwbGd0b2JoZ3h1a3dyZGxzemZhaXF4d2p2cmd4bnN2ZWVkeHNlZXlleWthcnFuanJ0bGFsaXl1ZHBhY2N0eml6Y2Z0amx1bmxnbmZ3Y3FxeGNxaWtvY3FmZnNqeXVyend5c2ZqbXN3dmhicm1zaGp1enNncHd5dWJ0ZmJud2FqdXZyZmhsY2N2ZndoeGZxdGhrY3doYXRrdHltZ3hvc3RqbHp0d2R4cml0eWdicmJpYmRna2V6dnphaml6eGFzam5yY2p3emRmdmRud3dxZXl1bWthbWh6b3FobnFqZnp3emJpeGNsY3hxcnRuaXpuZW14ZWFoZm96cCZxdW90Ow==
1
"apjesgpsxoeiokmqmfgvjslcjukbqxpsobyhjpbgdfruqdkeiszrlmtwgfxyfostpqczidfljwfbbrflkgdvtytbgqalguewnhvvmcgxboycffopmtmhtfizxkmeftcucxpobxmelmjtuzigsxnncxpaibgpuijwhankxbplpyejxmrrjgeoevqozwdtgospohznkoyzocjlracchjqnggbfeebmuvbicbvmpuleywrpzwsihivnrwtxcukwplgtobhgxukwrdlszfaiqxwjvrgxnsveedxseeyeykarqnjrtlaliyudpacctzizcftjlunlgnfwcqqxcqikocqffsjyurzwysfjmswvhbrmshjuzsgpwyubtfbnwajuvrfhlccvfwhxfqthkcwhatktymgxostjlztwdxritygbrbibdgkezvzajizxasjnrcjwzdfvdnwwqeyumkamhzoqhnqjfzwzbixclcxqrtniznemxeahfozp"