#include using namespace std; int longestPalSubstr( char *str ) { int n = strlen( str ); // get length of input string // table[i][j] will be false if substring str[i..j] // is not palindrome. // Else table[i][j] will be true bool table[n][n]; memset(table, 0, sizeof(table)); // All substrings of length 1 are palindromes int maxLength = 1; for (int i = 0; i < n; ++i) table[i][i] = true; // check for sub-string of length 2. int start = 0; for (int i = 0; i < n-1; ++i) { if (str[i] == str[i+1]) { table[i][i+1] = true; start = i; maxLength = 2; } } // Check for lengths greater than 2. k is length // of substring for (int k = 3; k <= n; ++k) { // Fix the starting index for (int i = 0; i < n-k+1 ; ++i) { // Get the ending index of substring from // starting index i and length k int j = i + k - 1; // checking for sub-string from ith index to // jth index iff str[i+1] to str[j-1] is a // palindrome if (table[i+1][j-1] && str[i] == str[j]) { table[i][j] = true; if (k > maxLength) { start = i; maxLength = k; } } } } //printf("Longest palindrome substring is: "); // printSubStr( str, start, start + maxLength - 1 ); return maxLength; // return length of LPS } int answerQuery(int l, int r,string s) { // Return the answer for this query modulo 1000000007. char *str = (char*)malloc(sizeof(char)*(r-l+1)); for(int i=l-1;i<=r;i++) str[i] = s[i]; return longestPalSubstr(&str[0] ); } int main() { string s; getline(cin,s); //initialize(s); int q; cin >> q; for(int a0 = 0; a0 < q; a0++){ int l; int r; cin >> l >> r; int result = answerQuery(l, r,s); cout << result << endl; } return 0; }