#include<bits/stdc++.h>
using namespace std;
// Transform S into T.
// For example, S = "abba", T = "^#a#b#b#a#$".
// ^ and $ signs are sentinels appended to each end to avoid bounds checking
string preProcess(string s)
{
int n = s.length();
if (n == 0) return "^$";
string ret = "^";
for (int i = 0; i < n; i++)
ret += "#" + s.substr(i, 1);
ret += "#$";
return ret;
}
//Manacher's Algorithm to find longest palindromic substring in O(n)
int dp[299999]={0};
int idx;
string Manachers(string s)
{
string T = preProcess(s);
int n = T.length();
int *P = new int[n];
int C = 0, R = 0;
for (int i = 1; i < n-1; i++)
{
int i_mirror = 2*C-i; // equals to i' = C - (i-C)
P[i] = (R > i) ? min(R-i, P[i_mirror]) : 0;
// Attempt to expand palindrome centered at i
while (T[i + 1 + P[i]] == T[i - 1 - P[i]])
P[i]++;
// If palindrome centered at i expand past R,
// adjust center based on expanded palindrome.
if (i + P[i] > R)
{
C = i;
R = i + P[i];
}
}
// Find the maximum element in P.
int maxLen = 0;
idx=0;
int centerIndex = 0;
for (int i = 1; i < n-1; i++)
{
if(P[i]>0)
{
dp[idx]=P[i];
++idx;
}
if (P[i] > maxLen)
{
maxLen = P[i];
centerIndex = i;
}
}
delete[] P;
return s.substr((centerIndex - 1 - maxLen)/2, maxLen);
}
int primes[199998+15];
void initialise()
{
int i;
for(i=0;i<199998;i++)
{
primes[i]=0;
}
}
void sieve()
{
int i,j;
primes[0]=1;
primes[1]=1;
for(i=2;i<=199997;i++)
{
if(!primes[i])
{
for(j=2*i;j<=199997;j+=i)
primes[j]=1;
}
}
}
int main()
{
initialise();
sieve();
int T;
string str;
/*for(int i=0;i<idx;i++)
cout<<dp[i]<<" ";*/
scanf("%d",&T);
while(T--)
{
cin>>str;
Manachers(str);
int cnt=0;
for(int i=0;i<idx;i++)
{
if(!primes[dp[i]])
++cnt;
}
printf("%d\n",cnt);
/*for(int i=0;i<idx;i++)
cout<<dp[i]<<" ";*/
//printf("\n");
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIFRyYW5zZm9ybSBTIGludG8gVC4KLy8gRm9yIGV4YW1wbGUsIFMgPSAiYWJiYSIsIFQgPSAiXiNhI2IjYiNhIyQiLgovLyBeIGFuZCAkIHNpZ25zIGFyZSBzZW50aW5lbHMgYXBwZW5kZWQgdG8gZWFjaCBlbmQgdG8gYXZvaWQgYm91bmRzIGNoZWNraW5nCnN0cmluZyBwcmVQcm9jZXNzKHN0cmluZyBzKSAKewogIGludCBuID0gcy5sZW5ndGgoKTsKICBpZiAobiA9PSAwKSByZXR1cm4gIl4kIjsKICBzdHJpbmcgcmV0ID0gIl4iOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgcmV0ICs9ICIjIiArIHMuc3Vic3RyKGksIDEpOwogCiAgcmV0ICs9ICIjJCI7CiAgcmV0dXJuIHJldDsKfQoKLy9NYW5hY2hlcidzIEFsZ29yaXRobSB0byBmaW5kIGxvbmdlc3QgcGFsaW5kcm9taWMgc3Vic3RyaW5nIGluIE8obikKaW50IGRwWzI5OTk5OV09ezB9OwppbnQgaWR4OwoKc3RyaW5nIE1hbmFjaGVycyhzdHJpbmcgcykgCnsKICBzdHJpbmcgVCA9IHByZVByb2Nlc3Mocyk7CiAgaW50IG4gPSBULmxlbmd0aCgpOwogIGludCAqUCA9IG5ldyBpbnRbbl07CiAgaW50IEMgPSAwLCBSID0gMDsKICBmb3IgKGludCBpID0gMTsgaSA8IG4tMTsgaSsrKSAKICB7CiAgICBpbnQgaV9taXJyb3IgPSAyKkMtaTsgLy8gZXF1YWxzIHRvIGknID0gQyAtIChpLUMpCiAgICAKICAgIFBbaV0gPSAoUiA+IGkpID8gbWluKFItaSwgUFtpX21pcnJvcl0pIDogMDsKICAgIAogICAgLy8gQXR0ZW1wdCB0byBleHBhbmQgcGFsaW5kcm9tZSBjZW50ZXJlZCBhdCBpCiAgICB3aGlsZSAoVFtpICsgMSArIFBbaV1dID09IFRbaSAtIDEgLSBQW2ldXSkKICAgICAgUFtpXSsrOwogCiAgICAvLyBJZiBwYWxpbmRyb21lIGNlbnRlcmVkIGF0IGkgZXhwYW5kIHBhc3QgUiwKICAgIC8vIGFkanVzdCBjZW50ZXIgYmFzZWQgb24gZXhwYW5kZWQgcGFsaW5kcm9tZS4KICAgIGlmIChpICsgUFtpXSA+IFIpIAogICAgewogICAgICBDID0gaTsKICAgICAgUiA9IGkgKyBQW2ldOwogICAgfQogIH0KIAogIC8vIEZpbmQgdGhlIG1heGltdW0gZWxlbWVudCBpbiBQLgogIGludCBtYXhMZW4gPSAwOwogIGlkeD0wOwogIGludCBjZW50ZXJJbmRleCA9IDA7CiAgZm9yIChpbnQgaSA9IDE7IGkgPCBuLTE7IGkrKykgCiAgewogIAlpZihQW2ldPjApCiAgCXsKICAJCWRwW2lkeF09UFtpXTsKICAJCSsraWR4OwogIAl9CiAgICBpZiAoUFtpXSA+IG1heExlbikgCiAgICB7CiAgICAgIG1heExlbiA9IFBbaV07CiAgICAgIGNlbnRlckluZGV4ID0gaTsKICAgIH0KICB9CiAgZGVsZXRlW10gUDsKICAKICByZXR1cm4gcy5zdWJzdHIoKGNlbnRlckluZGV4IC0gMSAtIG1heExlbikvMiwgbWF4TGVuKTsKfQoKaW50IHByaW1lc1sxOTk5OTgrMTVdOwoKdm9pZCBpbml0aWFsaXNlKCkKewoJaW50IGk7Cglmb3IoaT0wO2k8MTk5OTk4O2krKykKCXsKCQlwcmltZXNbaV09MDsKCX0KfQoKdm9pZCBzaWV2ZSgpCnsKCWludCBpLGo7CglwcmltZXNbMF09MTsKCXByaW1lc1sxXT0xOwoJZm9yKGk9MjtpPD0xOTk5OTc7aSsrKQoJewoJCWlmKCFwcmltZXNbaV0pCgkJewoJCQlmb3Ioaj0yKmk7ajw9MTk5OTk3O2orPWkpCgkJCXByaW1lc1tqXT0xOwoJCX0KCX0KfQppbnQgbWFpbigpIAp7Cglpbml0aWFsaXNlKCk7CglzaWV2ZSgpOwoJaW50IFQ7CglzdHJpbmcgc3RyOwoJLypmb3IoaW50IGk9MDtpPGlkeDtpKyspCgljb3V0PDxkcFtpXTw8IiAiOyovCglzY2FuZigiJWQiLCZUKTsKCXdoaWxlKFQtLSkKCXsKCQljaW4+PnN0cjsKCQlNYW5hY2hlcnMoc3RyKTsKCQlpbnQgY250PTA7CgkJZm9yKGludCBpPTA7aTxpZHg7aSsrKQoJCXsKCQkJaWYoIXByaW1lc1tkcFtpXV0pCgkJCSsrY250OwoJCX0KCQlwcmludGYoIiVkXG4iLGNudCk7CgkJLypmb3IoaW50IGk9MDtpPGlkeDtpKyspCgkJY291dDw8ZHBbaV08PCIgIjsqLwoJCQoJCS8vcHJpbnRmKCJcbiIpOwoJfQoJcmV0dXJuIDA7Cn0=