Cod sursa(job #251043)

Utilizator CezarMocanCezar Mocan CezarMocan Data 1 februarie 2009 18:08:46
Problema Iv Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <cstring>
#define mod 3210121

using namespace std;

int i, j, k, l, n, m, sol;
char s1[510], s2[510];
int a[50][50][50][50];

int main() {
	freopen("iv.in", "r", stdin);
	freopen("iv.out", "w", stdout);

	scanf("%s", s1);
	scanf("%s", s2);

	n = strlen(s1); m = strlen(s2);

	for (i = n; i > 0; i--)
		s1[i] = s1[i - 1];
	for (i = m; i > 0; i--)
		s2[i] = s2[i - 1];

	a[0][n + 1][0][m + 1] = a[0][n + 1][0][m] = a[0][n + 1][1][m + 1] = a[0][n][0][m + 1] = a[1][n + 1][0][m + 1] = 1;

	for (i = 0; i <= n; i++) {
//		memset(a[(i + 1) % 2], 0, sizeof(a[i % 2]));
		for (j = n + 1; j >= 1; j--)
			for (k = 0; k <= m; k++)
				for (l = m + 1; l >= 1; l--) {
					if (s1[i + 1] == s1[j - 1])
						a[(i + 1)][j - 1][k][l] = (a[(i + 1)][j - 1][k][l] + a[i][j][k][l]) % mod;
					if (s1[i + 1] == s2[l - 1])
						a[(i + 1)][j][k][l - 1] = (a[(i + 1)][j][k][l - 1] + a[i][j][k][l]) % mod;
					if (s2[k + 1] == s1[j - 1])
						a[i][j - 1][k + 1][l] = (a[i][j - 1][k + 1][l] + a[i][j][k][l]) % mod;
					if (s2[k + 1] == s2[l - 1])
						a[i][j][k + 1][l - 1] = (a[i][j][k + 1][l - 1] + a[i][j][k][l]) % mod;
				}
	}
			
	for (i = 0; i <= n; i++)
		for (j = 0; j <= m; j++)
			sol = (sol + a[i][i + 1][j][j + 1]) % mod;
	printf("%d\n", sol);
	return 0;
}