func_code_string: #include <bits/stdc++.h>   using namespace std;   inline int read() {     int f = 1, x = 0;     char ch = getchar();     while (ch <  0  || ch >  9 ) f = (ch ==  - ) ? -1 : 1, ch = getchar();     while (ch >=  0  && ch <=  9 ) x = x * 10 + ch -  0 , ch = getchar();     return f * x;   }   const int N = 500 + 5;   const int P = 1e9 + 7;   int n, m, len;   inline int add(int a, int b) {     a += b;     return a >= P ? a - P : a;   }   inline int mul(int a, int b) { return (unsigned long long)a * b % P; }   char s[N][N];   int dp[2][N][N];   int dx1[] = {0, 1}, dy1[] = {1, 0};   int dx2[] = {0, -1}, dy2[] = {-1, 0};   bool ok(int x, int y) { return x >= 0 && x < n && y >= 0 && y < m; }   void solve_odd() {     int u = 0, v = 1;     dp[u][0][n - 1] = 1;     len = (len + 1) >> 1;     for (int i = (0); i < (len - 1); ++i) {       u ^= 1, v ^= 1, memset(dp[u], 0, sizeof(dp[u]));       for (int j = (0); j < (n); ++j)         for (int k = (0); k < (n); ++k) {           int x1 = j, y1 = i - j;           int x2 = k, y2 = m - 1 - (i - (n - 1 - x2));           if (ok(x1, y1) && ok(x2, y2)) {             for (int p = (0); p < (2); ++p)               for (int q = (0); q < (2); ++q) {                 int tx1 = x1 + dx1[p], ty1 = y1 + dy1[p];                 int tx2 = x2 + dx2[q], ty2 = y2 + dy2[q];                 if (ok(tx1, ty1) && ok(tx2, ty2) && s[tx1][ty1] == s[tx2][ty2]) {                   dp[u][tx1][tx2] = add(dp[u][tx1][tx2], dp[v][x1][x2]);                 }               }           }         }     }     int ans = 0;     for (int i = (0); i < (n); ++i) ans = add(ans, dp[u][i][i]);     cout << ans << endl;   }   void solve_even() {     int u = 0, v = 1;     dp[u][0][n - 1] = 1;     len = (len) >> 1;     for (int i = (0); i < (len - 1); ++i) {       u ^= 1, v ^= 1, memset(dp[u], 0, sizeof(dp[u]));       for (int j = (0); j < (n); ++j)         for (int k = (0); k < (n); ++k) {           int x1 = j, y1 = i - j;           int x2 = k, y2 = m - 1 - (i - (n - 1 - x2));           if (ok(x1, y1) && ok(x2, y2)) {             for (int p = (0); p < (2); ++p)               for (int q = (0); q < (2); ++q) {                 int tx1 = x1 + dx1[p], ty1 = y1 + dy1[p];                 int tx2 = x2 + dx2[q], ty2 = y2 + dy2[q];                 if (ok(tx1, ty1) && ok(tx2, ty2) && s[tx1][ty1] == s[tx2][ty2]) {                   dp[u][tx1][tx2] = add(dp[u][tx1][tx2], dp[v][x1][x2]);                 }               }           }         }     }     int ans = 0;     for (int i = (0); i < (n); ++i)       ans = add(ans, add(dp[u][i][i], dp[u][i][i + 1]));     cout << ans << endl;   }   int main() {     n = read(), m = read();     for (int i = (0); i < (n); ++i) scanf( %s , s[i]);     if (s[0][0] != s[n - 1][m - 1]) {       puts( 0 );       return 0;     }     len = n + m - 1;     if (len & 1)       solve_odd();     else       solve_even();     return 0;   }   