Cod sursa(job #638725)

Utilizator andrei.12Andrei Parvu andrei.12 Data 21 noiembrie 2011 15:27:13
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<cstdio>
#include<cstring>

#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;

	a[0][0][0] = 1;
       	for (i = 0; i <= n1; i ++) {
		for (j = 0; j <= n2; j ++)
				for (k = 0; i+k <= n1; k ++)
					if (i+j-k + j <= n2) {
						if (i+j+k + i+j-k == N || i+j+k + i+j-k == N-1)
							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; k <= n1; k ++)
				a[0][j][k] = a[1][j][k], a[1][j][k] = 0;
	}

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

	return 0;
}