Cod sursa(job #2282376)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 13 noiembrie 2018 18:06:53
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#define DM 505
#define MD 3210121
#include <fstream>
using namespace std;

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

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