比赛 2022级DP专题练习赛1 评测结果 AAAAAAAAA
题目名称 管道取珠 最终得分 100
用户昵称 HeSn 运行时间 0.614 s
代码语言 C++ 内存使用 6.01 MiB
提交时间 2023-02-10 20:48:28
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int mod = 1024523;
int n, m, a[1010], b[1010], f[2][1010][1010];
signed main() {
	freopen("ballb.in", "r", stdin);
	freopen("ballb.out", "w", stdout);
	cin >> n >> m;
	for(int i = n; i >= 1; i --) {
		char x;
		cin >> x;
		a[i] = x - 'A';
	}
	for(int i = m; i >= 1; i --) {
		char x;
		cin >> x;
		b[i] = x - 'A';
	}
	f[0][0][0] = 1;
	for(int k = 1; k <= n + m; k ++){
		int x = k & 1, y = x ^ 1;
		for (int i = 0; i <= n; i ++) {
			for (int j = 0; j <= n; j ++) {
				f[x][i][j] = 0;
			}
		}
		for(int i = max(0, k - m); i <= min(n, k); i ++)
			for(int j = max(0, k - m); j <= min(n, k); j ++){
				if(i && j && a[i] == a[j]) {
					f[x][i][j] += f[y][i - 1][j - 1];
				}
				if(i && k - j && a[i] == b[k - j]) {
					f[x][i][j] += f[y][i - 1][j];
				}
				if(j && k - i && b[k - i] == a[j]) {
					f[x][i][j] += f[y][i][j - 1];
				}
				if(k - i && k - j && b[k - i] == b[k - j]) {
					f[x][i][j] += f[y][i][j];
				}
				f[x][i][j] %= mod;
			}
	}
	cout << f[(n + m) & 1][n][n];
	return 0;
}