Pagini recente » Cod sursa (job #2801984) | Cod sursa (job #1896751) | Cod sursa (job #1544208) | Cod sursa (job #2837995) | Cod sursa (job #3257883)
#include <iostream>
#include <fstream>
#include <vector>
//#include <bits/stdc++.h>
#define in fin
#define out fout
#define mod 3210121
#define ll long long
using namespace std;
ifstream fin("iv.in");
ofstream fout("iv.out");
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string a, b; in >> a >> b;
// a = "#" + a + "#";
// b = "#" + b + "#";
int n = a.size();
int m = b.size();
int nr_op = ( a.size() + b.size() ) / 2;
ll dp[nr_op + 1][n + 1][n + 1];
for(int i = 0; i <= nr_op; i++){
for(int j = 0; j <= n; j++){
for(int k = 0; k <= n; k++) dp[i][j][k] = 0;
}
}
ll sol = 0;
// if(a[0] == a[n]) dp[0][1][1] = 1;
// if(a[0] == b[m]) dp[0][1][0] = 1;
// if(b[0] == a[n]) dp[0][0][1] = 1;
// if(b[0] == b[m]) dp[0][0][0] = 1;
dp[0][0][0] = 1;
for(int p = 1; p <= nr_op; p++){
// cout << "P = " << p << '\n';
for(int i = 0; i <= n && i <= p; i++){
if(p - i > b.size()) continue;
for(int j = 0; j + i <= n && j <= p; j++){
if(p - j > b.size()) continue;
int i2 = p - i, j2 = p - j;
int pi = i - 1, pj = a.size() - j;
int pi2 = i2 - 1, pj2 = b.size() - j2;
if(pi >= 0 && pj < a.size() && a[pi] == a[pj]) dp[p][i][j] += dp[p - 1][i - 1][j - 1];
if(pi >= 0 && pj2 < b.size() && a[pi] == b[pj2]) dp[p][i][j] += dp[p - 1][i - 1][j];
if(pi2 >= 0 && pj < a.size() && b[pi2] == a[pj]) dp[p][i][j] += dp[p - 1][i][j - 1];
if(pi2 >= 0 && pj2 < b.size() && b[pi2] == b[pj2]) dp[p][i][j] += dp[p - 1][i][j];
dp[p][i][j] %= mod;
// cout << " -- > i = " << i << " j = " << j << " dp = " << dp[p][i][j] << '\n';
}
}
}
for(int i = 0; i <= n && i <= nr_op; i++){
for(int j = 0; j + i <= n && j <= nr_op; j++){
if(nr_op - i > b.size() || nr_op - j > b.size()) continue;
if(2 * nr_op - i - j > b.size()) continue;
sol += dp[nr_op][i][j];
sol %= mod;
}
}
out << sol << '\n';
return 0;
}