#include<bits/stdc++.h>
using namespace std;
int solveOne(int i, int j, string s, int **ispalindrome){
if(i > j) return 0;
if(i == j) return ispalindrome[i][j] = 1;
if(ispalindrome[i][j] != 0) return ispalindrome[i][j];
if(s[i] == s[j]){
int mid = j-i-1;
if(j==i+1) {
ispalindrome[i][j]=1;
return 2;
}
if(mid == solveOne(i+1, j-1, s, ispalindrome)){
ispalindrome[i][j] = 1;
return 2+ mid;
}
else
return ispalindrome[i][j] = 0;
}
return 0;
}
int solveTwo(int i, int j, string s,int **dp, int &count , int **ispalindrome){
// cout<<"inside solve two"<<endl;
if(i > j) return 0;
if(i == j) return dp[i][j] = 1;
if(dp[i][j] != 0) return dp[i][j];
count++;
return dp[i][j] = solveTwo(i+1, j, s,dp , count , ispalindrome) + solveTwo(i, j-1, s ,dp , count , ispalindrome) + (ispalindrome[i][j] != 0 ? 1 : 0) - solveTwo(i+1, j-1, s ,dp , count , ispalindrome);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
string s; cin>>s;
int len = s.length();
int **dp = new int*[len];
for(int i=0;i<len;i++){
dp[i] = new int[len];
for(int j = 0; j<len;j++)
dp[i][j] = 0;
}
int **ispalindrome = new int*[len];
for(int i=0;i<len;i++){
ispalindrome[i] = new int[len];
for(int j = 0; j<len;j++){
ispalindrome[i][j] = 0;
if(i==j) ispalindrome[i][j] = 1;
}
}
int count = 0;
for(int i=0; i<len; i++) {
for(int j=0; j<len; j++){
solveOne(i, j, s, ispalindrome);
}
}
solveTwo(0,len-1,s,dp , count , ispalindrome);
cout<<endl<<endl;
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
cout<<setw(3)<<dp[i][j]<<" ";
}
cout<<endl;
}
cout<<endl<<endl;
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
cout<<setw(3)<<ispalindrome[i][j]<<" ";
}
cout<<endl;
}
int n; cin>>n;
for(int i=0;i<n;i++){
int l,r; cin>>l>>r;
cout<<dp[l-1][r-1]<<endl;
}
cout<<endl<<endl<<count;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgoKaW50IHNvbHZlT25lKGludCBpLCBpbnQgaiwgc3RyaW5nIHMsIGludCAqKmlzcGFsaW5kcm9tZSl7CiAgIAoKICAgaWYoaSA+IGopIHJldHVybiAwOwoKCgogICBpZihpID09IGopICByZXR1cm4gaXNwYWxpbmRyb21lW2ldW2pdID0gMTsKCiAgIGlmKGlzcGFsaW5kcm9tZVtpXVtqXSAhPSAwKSByZXR1cm4gaXNwYWxpbmRyb21lW2ldW2pdOyAgCgogICBpZihzW2ldID09ICBzW2pdKXsKCiAgICAgIGludCBtaWQgPSBqLWktMTsKICAgICAgCiAgICAgIGlmKGo9PWkrMSkgewogICAgICAJaXNwYWxpbmRyb21lW2ldW2pdPTE7CiAgICAgIAlyZXR1cm4gMjsKICAgICAgfQoKICAgICAgaWYobWlkID09IHNvbHZlT25lKGkrMSwgai0xLCBzLCBpc3BhbGluZHJvbWUpKXsKICAgICAgICAgICAgaXNwYWxpbmRyb21lW2ldW2pdID0gMTsKICAgICAgICAgICAgcmV0dXJuIDIrIG1pZDsKICAgICAgfQoKICAgICAgZWxzZQogICAgICAgIHJldHVybiBpc3BhbGluZHJvbWVbaV1bal0gPSAwOwogICB9CiAgIHJldHVybiAwOwp9CgoKCmludCBzb2x2ZVR3byhpbnQgaSwgaW50IGosIHN0cmluZyBzLGludCAqKmRwLCBpbnQgJmNvdW50ICwgaW50ICoqaXNwYWxpbmRyb21lKXsKCiAgLy8gY291dDw8Imluc2lkZSBzb2x2ZSB0d28iPDxlbmRsOwoKICAgIGlmKGkgPiBqKSByZXR1cm4gMDsKCiAgICBpZihpID09IGopIHJldHVybiBkcFtpXVtqXSA9IDE7CgogICAgIGlmKGRwW2ldW2pdICE9IDApIHJldHVybiBkcFtpXVtqXTsKCiAgICAgY291bnQrKzsKCgogICAgcmV0dXJuIGRwW2ldW2pdID0gc29sdmVUd28oaSsxLCBqLCBzLGRwICwgY291bnQgLCBpc3BhbGluZHJvbWUpICsgc29sdmVUd28oaSwgai0xLCBzICxkcCAsIGNvdW50ICwgaXNwYWxpbmRyb21lKSArIChpc3BhbGluZHJvbWVbaV1bal0gIT0gMCA/IDEgOiAwKSAtIHNvbHZlVHdvKGkrMSwgai0xLCBzICxkcCAsIGNvdW50ICwgaXNwYWxpbmRyb21lKTsKCn0KCgppbnQgbWFpbigpCnsKCiAgICAgICAgICAjaWZuZGVmIE9OTElORV9KVURHRQogICAgZnJlb3BlbigiaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CiAgICBmcmVvcGVuKCJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwogICAjZW5kaWYKIApzdHJpbmcgczsgY2luPj5zOwppbnQgbGVuID0gcy5sZW5ndGgoKTsKCmludCAqKmRwID0gbmV3IGludCpbbGVuXTsKZm9yKGludCBpPTA7aTxsZW47aSsrKXsKICAgIGRwW2ldID0gbmV3IGludFtsZW5dOwogICAgZm9yKGludCBqID0gMDsgajxsZW47aisrKQogICAgICAgIGRwW2ldW2pdID0gMDsKfQoKCmludCAqKmlzcGFsaW5kcm9tZSA9IG5ldyBpbnQqW2xlbl07CmZvcihpbnQgaT0wO2k8bGVuO2krKyl7CiAgICBpc3BhbGluZHJvbWVbaV0gPSBuZXcgaW50W2xlbl07CiAgICBmb3IoaW50IGogPSAwOyBqPGxlbjtqKyspewogICAgIGlzcGFsaW5kcm9tZVtpXVtqXSA9IDA7CiAgICAgaWYoaT09aikgaXNwYWxpbmRyb21lW2ldW2pdID0gMTsKICAgfQp9CgoKCmludCBjb3VudCA9IDA7CmZvcihpbnQgaT0wOyBpPGxlbjsgaSsrKSB7Cglmb3IoaW50IGo9MDsgajxsZW47IGorKyl7CgkJc29sdmVPbmUoaSwgaiwgcywgaXNwYWxpbmRyb21lKTsKCX0KfQogc29sdmVUd28oMCxsZW4tMSxzLGRwICwgY291bnQgLCBpc3BhbGluZHJvbWUpOwogICBjb3V0PDxlbmRsPDxlbmRsOwogICBmb3IoaW50IGk9MDtpPGxlbjtpKyspewogICAgICAgICBmb3IoaW50IGo9MDtqPGxlbjtqKyspewogICAgY291dDw8c2V0dygzKTw8ZHBbaV1bal08PCIgIjsKICAgfQogICAgICAgIGNvdXQ8PGVuZGw7Cn0KCiAgIGNvdXQ8PGVuZGw8PGVuZGw7CiAgIGZvcihpbnQgaT0wO2k8bGVuO2krKyl7CiAgICAgICAgIGZvcihpbnQgaj0wO2o8bGVuO2orKyl7CiAgICBjb3V0PDxzZXR3KDMpPDxpc3BhbGluZHJvbWVbaV1bal08PCIgIjsKICAgfQogICAgICAgIGNvdXQ8PGVuZGw7Cn0KCgppbnQgbjsgY2luPj5uOwpmb3IoaW50IGk9MDtpPG47aSsrKXsKaW50IGwscjsgY2luPj5sPj5yOwoKY291dDw8ZHBbbC0xXVtyLTFdPDxlbmRsOwoKfQoKY291dDw8ZW5kbDw8ZW5kbDw8Y291bnQ7CiAgICByZXR1cm4gMDsKfQo=