Cod sursa(job #344153)

Utilizator CezarMocanCezar Mocan CezarMocan Data 28 august 2009 18:15:59
Problema Iv Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#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] = d[1][n + 1][0] = 1;

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

	printf("%d\n", sol);

}