func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long MOD = 1e9 + 7;   const int MOVX[2] = {0, 1};   const int MOVY[2] = {1, 0};   int n, m;   string fore[501];   vector<pair<int, int> > dep[1001];   int pid[501][501];   long long tbl[2][501][501];   inline bool valid(int x, int y) { return x >= 0 && x < n && y >= 0 && y < m; }   void bfs() {     int d[n][m];     memset(d, -1, sizeof d);     d[0][0] = 0;     queue<pair<int, int> > que;     que.push({0, 0});     dep[0].push_back({0, 0});     pid[0][0] = 0;     while (!que.empty()) {       pair<int, int> p = que.front();       que.pop();       for (int i = 0; i < 2; ++i) {         int x = p.first + MOVX[i];         int y = p.second + MOVY[i];         if (valid(x, y) && d[x][y] == -1) {           d[x][y] = d[p.first][p.second] + 1;           pid[x][y] = dep[d[x][y]].size();           dep[d[x][y]].push_back({x, y});           que.push({x, y});         }       }     }   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(NULL);     cin >> n >> m;     for (int i = 0; i < n; ++i) cin >> fore[i];     bfs();     int id = 0;     int len = n + m - 2;     int h = len >> 1;     for (int i = 0; i < (int)dep[h].size(); ++i)       for (int j = 0; j < (int)dep[len - h].size(); ++j)         tbl[id][i][j] = tbl[!id][i][j] = 0;     for (const pair<int, int> &p : dep[h]) {       if (len & 1) {         for (int i = 0; i < 2; ++i) {           int x = p.first + MOVX[i];           int y = p.second + MOVY[i];           if (valid(x, y) && fore[p.first][p.second] == fore[x][y])             tbl[id][pid[p.first][p.second]][pid[x][y]] = 1;         }       } else {         tbl[id][pid[p.first][p.second]][pid[p.first][p.second]] = 1;       }     }     while (h > 0) {       for (const pair<int, int> &p1 : dep[h])         for (const pair<int, int> &p2 : dep[len - h]) {           long long &r =               tbl[id][pid[p1.first][p1.second]][pid[p2.first][p2.second]];           if (r) {             for (int i = 0; i < 2; ++i)               for (int j = 0; j < 2; ++j) {                 int x1 = p1.first - MOVX[i];                 int y1 = p1.second - MOVY[i];                 int x2 = p2.first + MOVX[j];                 int y2 = p2.second + MOVY[j];                 if (valid(x1, y1) && valid(x2, y2) &&                     fore[x1][y1] == fore[x2][y2]) {                   long long &q = tbl[!id][pid[x1][y1]][pid[x2][y2]];                   q = (q + r) % MOD;                 }               }           }         }       for (int i = 0; i < (int)dep[h].size(); ++i)         for (int j = 0; j < (int)dep[len - h - 1].size(); ++j) tbl[id][i][j] = 0;       id = !id;       --h;     }     cout << tbl[id][0][0] << endl;     return 0;   }   