Cod sursa(job #783390)

Utilizator marinMari n marin Data 2 septembrie 2012 18:30:51
Problema Iv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#define DIM 510

#define MOD 3210121

using namespace std;


int D[2][DIM][DIM];
int N, M, p1, p2, p3, q1, q2, q3, i, j, k, L, sol;
char A[DIM];
char B[DIM];

int main() {
	ifstream f("iv.in");
	ofstream g("iv.out");
	f>>A+1;
	f>>B+1;
	N = strlen(A+1);
	M = strlen(B+1);
	A[0] = '0';
	B[0] = '1';
	A[N+1] = '2';
	B[M+1] = '3';
	L = (N+M)/2;
	
	
	
	D[0][0][L+1] = 1;
	for (i=1; i<=L;i++) {
		//sunt i caractere in stanga palindromului si i caractere in dreapta
		for (p1 = 0; p1<=N; p1++) {
			q1 = i - p1;
			if (q1 >= 0) {
				for (p3 = 0; p3 <= i; p3++) {
					q3 = i - p3;
					if (q3 >= 0 && p1 + p3 <= N && q1 + q3 <= M) {
						p2 = N-p3+1;
						q2 = M-q3+1;
						
						if (A[p1] == A[p2]) {
							D[1][p1][p2] += D[0][p1-1][p2+1];
							D[1][p1][p2] %= MOD;
						}
						
						if (A[p1] == B[q2]) {
							D[1][p1][p2] += D[0][p1-1][p2];
							D[1][p1][p2] %= MOD;
						}
						
						if (B[q1] == A[p2]) {
							D[1][p1][p2] += D[0][p1][p2+1];
							D[1][p1][p2] %= MOD;
						}
						
						if (B[q1] == B[q2]) {
							D[1][p1][p2] += D[0][p1][p2];
							D[1][p1][p2] %= MOD;
						}
						
					}
					
				}
			}
		}
		
		for (j=0;j<=N+M+1;j++)
			for (k=0;k<=N+M+1;k++) {
				D[0][j][k] = D[1][j][k];
				D[1][j][k] = 0;
			}
		
	}
	
	sol = 0;
	for (i=0;i<=N+M+1;i++)
		for (j=0; j<=N+M+1;j++){
			sol += D[0][i][j];
			if (sol >= MOD)
				sol -= MOD;
		}
	g<<sol<<"\n";
	return 0;
}