Cod sursa(job #41044)
#include <stdio.h>
#include <String.h>
#define NMAX 32
#define mod(a) ((a) >= 3210121 ? ((a)-3210121):(a))
int DP[NMAX][NMAX][NMAX][NMAX], N, M;
int A[NMAX], B[NMAX];
char a[NMAX], b[NMAX];
int main()
{
int i, j, k, l, sol = 0;
freopen("iv.in", "r", stdin);
gets(a); gets(b);
N = strlen(a); M = strlen(b);
for (i = 1; i <= N; i++)
A[i] = (int)a[i-1];
for (i = 1; i <= M; i++)
B[i] = (int)b[i-1];
DP[0][0][0][0] = 1;
for (i = 0; i <= N; i++)
for (j = 0; j <= N; j++)
for (k = 0; k <= M; k++)
for (l = 0; l <= M; l++)
{
if (A[i+1] == B[k+1]) DP[i+1][j][k+1][l] = 2*mod(DP[i+1][j][k+1][l]+DP[i][j][k][l]);
if (A[i+1] == B[M-l]) DP[i+1][j][k][l+1] = 2*mod(DP[i+1][j][k][l-1]+DP[i][j][k][l]);
if (A[N-j] == B[k+1]) DP[i][j+1][k+1][l] = 2*mod(DP[i][j-1][k+1][l]+DP[i][j][k][l]);
if (A[N-j] == B[M-l]) DP[i][j+1][k][l+1] = 2*mod(DP[i][j-1][k][l-1]+DP[i][j][k][l]);
}
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
for (k = 1; k <= M; k++)
for (l = 1; l <= M; l++)
if (i+j+k+l == N+M) sol += DP[i][j][k][l];
freopen("iv.out", "w", stdout);
printf("%d\n", sol);
return 0;
}