Cod sursa(job #344156)

Utilizator CezarMocanCezar Mocan CezarMocan Data 28 august 2009 18:30:54
Problema Iv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 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] = 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);

}