Pagini recente » Cod sursa (job #2406463) | Cod sursa (job #2036708) | Cod sursa (job #2881639) | Cod sursa (job #2842493) | Cod sursa (job #3171539)
#include <fstream>
#include <cstring>
#define MOD 3210121
#define DIM 510
std::ifstream fin("iv.in");
std::ofstream fout("iv.out");
int s1_max, s2_max, total, sum;
char s1[DIM], s2[DIM];
int v1[DIM][DIM], v2[DIM][DIM];
int main() {
fin >> (s1 + 1) >> (s2 + 1);
s1_max = strlen(s1 + 1);
s2_max = strlen(s2 + 1);
total = s1_max + s2_max;
if (s1[1] == s1[s1_max])
v2[1][1] = 1;
if (s1[1] == s2[s2_max])
v2[1][0] = 1;
if (s2[1] == s2[s2_max])
v2[0][0] = 1;
if (s2[1] == s1[s1_max])
v2[0][1] = 1;
for (int i = 2; i <= total / 2; i++) {
for (int j = 0; j <= s1_max; j++) {
for (int k = 0; k <= s1_max; k++) {
if ((2 * i - j - k) <= s2_max && (j + k) <= s1_max) {
if (s1[j] == s1[s1_max - k + 1])
v1[j][k] += v2[j - 1][k - 1];
if (s1[j] == s2[s2_max - (i - k) + 1])
v1[j][k] += v2[j - 1][k];
if (s2[i - j] == s2[s2_max - (i - k) + 1])
v1[j][k] += v2[j][k];
if (s2[i - j] == s1[s1_max - k + 1])
v1[j][k] += v2[j][k - 1];
while (v1[j][k] >= MOD)
v1[j][k] -= MOD;
}
}
}
memcpy(v2, v1, sizeof(v1));
memset(v1, 0, sizeof(v1));
}
for (int i = 0; i <= s1_max; i++)
for (int j = 0; j <= s1_max; j++)
sum += v2[i][j];
fout << sum;
return 0;
}