func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 5050, b = 53, mod = 1073676287;   int n, q, pre[N], suf[N], ans[N], binv[N], dp[N][N];   int mul(int x, int y) { return (x * 1ll * y) % mod; }   int add(int x, int y) { return ((x + y) % mod + mod) % mod; }   int pw(int b, int p) {     if (!p) return 1;     int ret = pw(b, p / 2);     ret = mul(ret, ret);     if (p % 2) ret = mul(ret, b);     return ret;   }   int getl(int l, int r) {     int f = add(pre[r], -pre[l - 1]);     return mul(f, binv[l]);   }   int getr(int l, int r) {     int f = add(suf[l], -suf[r + 1]);     return mul(f, binv[n - r + 1]);   }   int check(int l, int r) { return getl(l, r) == getr(l, r); }   int solve(int i, int j) {     if (i > n || j <= 0 || j < i) return 0;     int &x = dp[i][j];     if (x != -1) return x;     return x = check(i, j) + solve(i, j - 1) + solve(i + 1, j) -                solve(i + 1, j - 1);   }   string s;   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     cin >> s;     memset(dp, -1, sizeof dp);     n = s.size();     s =  @  + s;     int bb = 1;     for (int i = 1; i <= n; i++) {       binv[i] = pw(bb, mod - 2);       pre[i] = add(pre[i - 1], mul((s[i] -  a ), bb));       bb = mul(bb, b);     }     bb = 1;     for (int i = n; i >= 1; i--) {       suf[i] = add(suf[i + 1], mul((s[i] -  a ), bb));       bb = mul(bb, b);     }     cin >> q;     while (q--) {       int l, r;       cin >> l >> r;       cout << solve(l, r) <<   n ;     }   }   