Cod sursa(job #319867)

Utilizator geoNechifor George geo Data 2 iunie 2009 15:55:55
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <fstream>
using namespace std;

char str[2][501];
int tl;
int ssize[2];
long matrix[2][501][501];

long setMatrixElem(int i,int n1,int n2) {
	long sum = 0;
	int s1p1 = n1-1;
	int s1p2 = ssize[0]-n2;
	int s2p1 = i-n1-1;
	int s2p2 = ssize[1]-(i-n2);
	int mfi = (i-1)%2;
	if (s1p1>=s1p2)
		return 0;
	if (s2p1>=s2p2)
		return 0;
	
	if ((n1<=i-1)&&(n2<=i-1)) {
		if (str[1][s2p1] == str[1][s2p2])
			sum += matrix[mfi][n1][n2];
	}
	if ((n1<=i-1)&&(n2>0)) {
		if (str[1][s2p1] == str[0][s1p2])
			sum += matrix[mfi][n1][n2-1];
	}
	if ((n1>0)&&(n2<=i-1)) {
		if (str[0][s1p1] == str[1][s2p2])
			sum += matrix[mfi][n1-1][n2];
	}
	if ((n1>0)&&(n2>0)) {
		if (str[0][s1p1] == str[0][s1p2])
			sum += matrix[mfi][n1-1][n2-1];
	}
	return sum % 3210121;
}

int main() {
	matrix[0][0][0] = 1;
	ifstream fin("iv.in");
	ofstream fout("iv.out");
	fin>>str[0];
	fin>>str[1];
	ssize[0] = strlen(str[0]);
	ssize[1] = strlen(str[1]);
	tl = ssize[0] + ssize[1];
	for (int i=1;i<=tl/2;i++) {
		//cout<<endl;
		for (int n1 = 0;n1<=i;n1++) {
			//cout<<endl;
			for (int n2 = 0;n2<=i;n2++) {
				matrix[i%2][n1][n2] = setMatrixElem(i,n1,n2);
				//cout<<matrix[i%2][n1][n2]<<" ";
			}
		}
	}
	long sum = 0;
	for (int i=0;i<=ssize[0];i++)
		sum += matrix[(tl/2)%2][i][ssize[0]-i];
	if (tl%2==1) {
		for (int i=0;i<ssize[0];i++)
			sum += matrix[(tl/2)%2][i][ssize[0]-i-1];
	}
	fout<<sum % 3210121<<endl;
	fin.close();
	fout.close();
	return 0;
}