比赛 |
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;
}