Cod sursa(job #250621)

Utilizator raduzerRadu Zernoveanu raduzer Data 31 ianuarie 2009 12:45:04
Problema Iv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <cstring>

const int MAX_N = 510;
const int MOD = 3210121;

int n, m, sol;
int d[2][MAX_N][MAX_N];
char a[MAX_N], b[MAX_N];

int main()
{
	int i, j, q, p;
	freopen("iv.in", "r", stdin);
	freopen("iv.out", "w", stdout);
	
	scanf("%s\n", a + 1);
	scanf("%s\n", b + 1);
	a[0] = b[0] = ' ';
	
	n = strlen(a);
	m = strlen(b);
	
	d[0][0][0] = 1;
	
	for (q = 0, p = 1; q < (n + m) / 2; ++q, p = 1 - p)
	{
		memset(d[p], 0, sizeof(d[p]));
		
		for (i = 0; i <= n; ++i)
			for (j = 0; j <= n; ++j)
				if (d[1 - p][i][j])
				{
					if (a[i + 1] == a[n - j] && i + 1 < n - j) d[p][i + 1][j + 1] = (d[p][i + 1][j + 1] + d[1 - p][i][j]) % MOD;
					if (b[q - i + 1] == b[m - (q - j)] && q - i + 1 < m - (q - j)) d[p][i][j] = (d[p][i][j] + d[1 - p][i][j]) % MOD;
					if (a[i + 1] == b[m - (q - j)] && i + 1 < n - j + 1 && q - i < m - (q - j)) d[p][i + 1][j] = (d[p][i + 1][j] + d[1 - p][i][j]) % MOD;
					if (b[q - i + 1] == a[n - j] && i < n - j && q - i + 1 < m - (q - j) + 1) d[p][i][j + 1] = (d[p][i][j + 1] + d[1 - p][i][j]) % MOD;
				}
	}
	
	for (i = 0; i <= n; ++i)
		for (j = 0; j <= n; ++j) sol = (sol + d[1 - p][i][j]) % MOD;
	
	printf("%d\n", sol);
}