Cod sursa(job #165403)

Utilizator andrei.12Andrei Parvu andrei.12 Data 25 martie 2008 22:20:20
Problema Iv Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>
#include<string.h>

#define lg 505
#define BAZA 3210121

int N, n1, n2, i, j, k, h, raspuns, a[2][lg][lg];
char sir1[lg], sir2[lg];
int main()
{
	freopen("iv.in", "rt", stdin);
	freopen("iv.out", "wt", stdout);

	scanf("%s", sir1+1);
	scanf("%s", sir2+1);

	n1 = strlen(sir1+1), n2 = strlen(sir2+1);
	N = n1 + n2;
//	printf("%d %d\n", n1, n2);

	a[0][0][0] = 1;
	for (i = 0; i <= n1; i ++){
		for (j = 0; j <= n2; j ++)
			//if (i+j <= n1)
				for (k = 0; i+k <= n1; k ++)
					if (i+j-k + j <= n2){
						if (i+j+k + i+j-k == N)
							raspuns = (raspuns + a[0][j][k]) % BAZA;
					
						h = i+j-k;

						if (sir1[i+1] == sir1[n1-k])
							a[1][j][k+1] = (a[1][j][k+1] + a[0][j][k]) % BAZA;
						if (sir1[i+1] == sir2[n2-h])
							a[1][j][k] = (a[1][j][k] + a[0][j][k]) % BAZA;
					
						if (sir2[j+1] == sir1[n1-k])
							a[0][j+1][k+1] = (a[0][j+1][k+1] + a[0][j][k]) % BAZA;
						if (sir2[j+1] == sir2[n2-h])
							a[0][j+1][k] = (a[0][j+1][k] + a[0][j][k]) % BAZA;
					}
		for (j = 0; j <= n2; j ++)
			for (k = 0; i+k <= n1; k ++)
				a[0][j][k] = a[1][j][k], a[1][j][k] = 0;
	}
	for (i = 0; i <= n1; i ++)
		for (j = 0; j <= n2; j ++)
			for (k = 0; k <= n1; k ++);
//				printf("a[%d][%d][%d][%d] = %d\n", i, j, k, i+j-k, a[i][j][k]);

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

	return 0;
}