Pagini recente » Cod sursa (job #635708) | Cod sursa (job #297674) | Borderou de evaluare (job #2045462) | Cod sursa (job #2310038) | Cod sursa (job #344156)
Cod sursa(job #344156)
#include <cstdio>
#include <cstring>
#define maxn 510
#define mod 3210121
using namespace std;
int n, m, i, j, k, l, sol;
char s1[maxn], s2[maxn];
int d[2][maxn][maxn];
int main() {
freopen("iv.in", "r", stdin);
freopen("iv.out", "w", stdout);
scanf(" %s ", s1 + 1);
scanf(" %s ", s2 + 1);
// printf("%c %c \n %c %c\n", s1[1], s1[2], s2[1], s2[2]);
for (n = 1; s1[n] != 0; n++);
n--;
for (m = 1; s2[m] != 0; m++);
m--;
s1[0] = '+'; s2[0] = '-';
// printf("%d %d\n", n, m);
d[0][n + 1][0] = 1;
for (i = 0; i < (n + m) / 2; i++) {
for (k = 0; k <= m; k++) {
for (j = n + 1; j > i; j--) {
l = m + n + 2 - i - j - k;
if (l >= 0 && l <= m + 1 && d[0][j][k] > 0) {
if (s1[i + 1] == s1[j - 1])
d[1][j - 1][k] = (d[1][j - 1][k] + d[0][j][k]) % mod;
if (s1[i + 1] == s2[l - 1])
d[1][j][k] = (d[1][j][k] + d[0][j][k]) % mod;
if (s2[k + 1] == s1[j - 1])
d[1][j - 1][k + 1] = (d[1][j - 1][k + 1] + d[1][j][k]) % mod;
if (s2[k + 1] == s2[l - 1])
d[1][j][k + 1] = (d[1][j][k + 1] + d[1][j][k]) % mod;
}
}
// sol = (sol + d[1][i + 1][k]) % mod;
}
memcpy(d[0], d[1], sizeof(d[1]));
memset(d[1], 0, sizeof(d[1]));
}
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
sol = (sol + d[0][i][j]) % mod;
printf("%d\n", sol);
}