dpi,j,kdp_{i,j,k} 为走了 kk 步最终到达 (i,j)(i,j) 的合法方案数,直接 DP 并根据走步轨迹转移即可。

#include <bits/stdc++.h>
using namespace std;
int ok[4][2012][2012];
char f[4][2012], g[2012];
int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= 2; i++)
        for (int j = 1; j <= n; j++)
            cin >> f[i][j];
    for (int i = 1; i <= m; i++)
        cin >> g[i];
    for (int i = 1; i <= 2; i++)
        for (int j = 1; j <= n; j++)
            if (f[i][j] == g[m]) ok[i][j][m] = 1;
    for (int k = m - 1; k >= 1; k--)
        for (int i = 1; i <= 2; i++)
            for (int j = 1; j <= n; j++)
            {
                if (f[i][j] != g[k]) continue;
                ok[i][j][k] += ok[i - 1][j][k + 1];
                ok[i][j][k] += ok[i + 1][j][k + 1];
                ok[i][j][k] += ok[i][j - 1][k + 1];
                ok[i][j][k] += ok[i][j + 1][k + 1];
                ok[i][j][k] %= 1007;
            }
    int ans = 0;
    for (int i = 1; i <= 2; i++)
        for (int j = 1; j <= n; j++)
            ans += ok[i][j][1];
    cout << ans % 1007 << endl;
    return 0;
}