Cod sursa(job #344161)

Utilizator CezarMocanCezar Mocan CezarMocan Data 28 august 2009 20:01:34
Problema Iv Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 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);

	for (n = 1; s1[n] != 0; n++);	n--;
	for (m = 1; s2[m] != 0; m++);	m--;

	d[0][0][0] = 1;

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

	for (i = 0; i <= n; i++)
		for (j = 0; j <= n; j++)
			sol = (sol + d[0][i][j]) % mod;

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

}