Pagini recente » Cod sursa (job #2494250) | Cod sursa (job #1252601) | Cod sursa (job #1327837) | Diferente pentru implica-te/arhiva-educationala intre reviziile 223 si 152 | Cod sursa (job #2718006)
#include <bits/stdc++.h>
#define MOD 3210121
#define NMAX 505
using namespace std;
ifstream fin("iv.in");
ofstream fout("iv.out");
int dp[2][NMAX][NMAX], p;
char a[NMAX], b[NMAX];
void addSelf(int &val1, int val2){
val1 += val2;
if(val1 >= MOD)
val1 -= MOD;
}
int main()
{
fin >> (a + 1) >> (b + 1);
int n = strlen(a + 1);
int m = strlen(b + 1);
int lgS = n + m, rez = 0;
dp[0][0][0] = 1;
for(int i = 0; i <= n; ++i){
for(int j = 0; i + j <= n; ++j)
for(int k = 0; k <= m; ++k)
{
int q = i + k - j;
if(q < 0 || q + k > m)
continue;
if(i + j + k + q == lgS || i + j + k + q == lgS - 1){
addSelf(rez, dp[p][j][k]);
continue;
}
if(a[i + 1] == a[n - j])
addSelf(dp[1 - p][j + 1][k], dp[p][j][k]);
if(m - q >= 1 && b[k + 1] == b[m - q])
addSelf(dp[p][j][k + 1], dp[p][j][k]);
if(m - q >= 1 && b[m - q] == a[i + 1])
addSelf(dp[1 - p][j][k], dp[p][j][k]);
if(a[n - j] == b[k + 1])
addSelf(dp[p][j + 1][k + 1], dp[p][j][k]);
dp[p][j][k] = 0;
}
p = 1 - p;
}
fout << rez << '\n';
return 0;
}