#include<bits/stdc++.h>
#define int long long
#define F(i,l,r) for(int i = l;i <= r;i ++)
using namespace std;
const int N = 1e6 + 50,M = 1e3 + 50;
const int INT = 0x7fffffff,mod = 1024523;
int n,m;
string a,b;
int f[3][505][505];
//f[k][i][j]
//取到k个球,第一个人在管道1内取到i个球,第二个人在管道1内取到j个球的情况
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> m >> a >> b;
f[0][0][0] = 1;
for(int k = 1;k <= n + m;k ++){
int now = k & 1,bef = !now;
// cout << now << ' ' << bef << '\n';
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++) f[now][i][j] = 0;
int maxx = min(n,k),minx = max(0ll,k - m);
for(int i = minx;i <= maxx;i ++){
for(int j = minx;j <= maxx;j ++){
if(i && j && a[i-1] == a[j-1]){
f[now][i][j] = (f[now][i][j] + f[bef][i-1][j-1]) % mod;
}if(i && k-j && a[i-1] == b[k-j-1]){
f[now][i][j] = (f[now][i][j] + f[bef][i-1][j]) % mod;
}if(k-i && j && b[k-i-1] == a[j-1]){
f[now][i][j] = (f[now][i][j] + f[bef][i][j-1]) % mod;
}if(k-i && k-j && b[k-i-1] == b[k-j-1]){
f[now][i][j] = (f[now][i][j] + f[bef][i][j]) % mod;
}
// cout << f[now][i][j] << ' ';
}
// cout << '\n';
}
// cout << '\n';
}
cout << f[(n+m) & 1][n][n];
return 0;
}
马蜂有点冗余,不过我觉得比较容易看懂
2 3
AB
ABA
28