Cod sursa(job #2281296)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 11 noiembrie 2018 21:22:43
Problema Iv Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#define DM 501
#define MD 3210121
#include <fstream>
using namespace std;

ifstream fi ("iv.in");
ofstream fo ("iv.out");
int n, m, sol, dp[DM][DM][DM];
string a, b;

int main() {
	fi >> a >> b;
	n = a.size();
	m = b.size();
	dp[1][1][0] += (a[0] == a[n-1]);
	dp[0][1][1] += (b[0] == a[n-1]);
	dp[1][0][0] += (a[0] == b[m-1]);
	dp[0][0][1] += (b[0] == b[m-1]);
	if ((n + m)/2 == 1) {
		sol += (a[0] == b[0]);
	}
	for (int lg = 1; lg <= (n + m)/2; ++lg)
		for (int i = 0; i <= lg; ++i) 
			if (i < n && lg - i < m)
				for (int j = 0; j <= lg; ++j)
					if (j < n && lg - j < m) {
						// starea de baza [i][j][lg-i]
						if (a[i] == a[n-1-j]) {
							dp[i+1][j+1][lg-i] += dp[i][j][lg-1];
							dp[i+1][j+1][lg-i] %= MD;
							if (lg + 1 == (n + m)/2) {
								sol += dp[i+1][j+1][lg-i];
								sol %= MD;
							}
						}
						if (b[lg-i] == a[n-1-j]) {
							dp[i][j+1][lg-i+1] += dp[i][j][lg-1];
							dp[i][j+1][lg-i+1] %= MD;
							if (lg + 1 == (n + m)/2) {
								sol += dp[i][j+1][lg-i+1];
								sol %= MD;
							}
						}
						if (a[i] == b[m-1-lg+j]) {
							dp[i+1][j][lg-i] += dp[i][j][lg-1];
							dp[i+1][j][lg-i] %= MD;
							if (lg + 1 == (n + m)/2) {
								sol += dp[i+1][j][lg-i];
								sol %= MD;
							}
						}
						if (b[lg-i] == b[m-1-lg+j]) {
							dp[i][j][lg-i+1] += dp[i][j][lg-1];
							dp[i][j][lg-i+1] %= MD;
							if (lg + 1 == (n + m)/2) {
								sol += dp[i][j][lg-i+1];
								sol %= MD;
							}
						}
					}
	fo << sol;
	return 0;
}