func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long MOD = 1e9 + 7;   int dp[502][502][2], n, m;   char str[502][502];   int dis;   int check(int x, int y) {     if (x < 0 or x >= n and y < 0 or y >= m)       return 0;     else       return 1;   }   int call(int x, int y, int a, int idx) {     int ham = x + y;     int paisi = n - 1 - a;     int baki = ham - paisi;     int b = m - 1 - baki;     if (check(x, y) == 0 or check(a, b) == 0) return dp[x][y][a & 1] = 0;     if (str[x][y] != str[a][b]) return dp[x][y][a & 1] = 0;     if (idx == 0) return dp[x][y][a & 1];     int dx = ((x - a) < 0 ? -(x - a) : (x - a));     int dy = ((y - b) < 0 ? -(y - b) : (y - b));     if (dis % 2 == 0) {       if (ham + 1 > dis / 2) return dp[x][y][a & 1] = 0;       if (ham + 1 == dis / 2) return dp[x][y][a & 1] = (dx + dy <= 1);     } else {       if (ham > dis / 2) return dp[x][y][a & 1] = 0;       if (ham == dis / 2) return dp[x][y][a & 1] = (x == a and y == b);     }     long long ret = 0;     ret += call(x + 1, y, a, 1 - idx);     ret += call(x + 1, y, a - 1, 1 - idx);     ret += call(x, y + 1, a, 1 - idx);     ret += call(x, y + 1, a - 1, 1 - idx);     return dp[x][y][a & 1] = ret % MOD;   }   int main() {     scanf( %d %d , &n, &m);     dis = n + m - 1;     for (int i = 0; i < n; i++) scanf( %s , str[i]);     for (int a = 0; a < n; a++) {       for (int y = m - 1; y >= 0; y--) {         int tempx = n - 1;         int tempy = y;         while (tempx >= 0 and tempy < m) {           call(tempx, tempy, a, 1);           tempy++;           tempx--;         }       }       for (int x = n - 2; x >= 0; x--) {         int tempx = x;         int tempy = 0;         while (tempx >= 0 and tempy < m) {           call(tempx, tempy, a, 1);           tempy++;           tempx--;         }       }     }     printf( %d n , dp[0][0][(n - 1) & 1]);   }   