Cod sursa(job #2377482)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 10 martie 2019 13:28:26
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fi("iv.in");
ofstream fo("iv.out");

const int N = 505, MOD = 3210121;

char sa[N], sb[N], rev_sa[N], rev_sb[N];
vector<vector<int>> dp[2];

int n, m, ant;

static int add(int a, int b) {
	int res = a + b;
	if (res >= MOD)
		res-= MOD;
	return res; }


int main() {
	fi >> (sa + 1) >> (sb + 1);
	n = strlen(sa + 1);
	m = strlen(sb + 1);

	for (int i = 1; i <= n; ++i)
		rev_sa[i] = sa[n - i + 1];
	for (int i = 1; i <= m; ++i)
		rev_sb[i] = sb[m - i + 1];

	for (auto i: {0, 1})
		dp[i] = vector<vector<int>>(m + 1, vector<int>(n + 1));

	dp[1][0][0] = 1;
	for (int a = 0; a <= n; ++a) {
		for (int b = 0; b <= m; ++b) if (a > 0 || b > 0) {
		for (int ra = 0; ra <= n && a + ra <= n; ++ra) {
			int rb = a + b - ra;
			if (b + rb > m || rb < 0)
				continue;

			if (ra > 0 && a > 0 && sa[a] == rev_sa[ra])
				dp[1][b][ra] = add(dp[1][b][ra], dp[0][b][ra - 1]);

			if (rb > 0 && a > 0 && sa[a] == rev_sb[rb])
				dp[1][b][ra] = add(dp[1][b][ra], dp[0][b][ra]);

			if (b > 0 && rb > 0 && sb[b] == rev_sb[rb])
				dp[1][b][ra] = add(dp[1][b][ra], dp[1][b - 1][ra]);

			if (b > 0 && ra > 0 && sb[b] == rev_sa[ra])
				dp[1][b][ra] = add(dp[1][b][ra], dp[1][b - 1][ra - 1]); } }

		if (0 <= (n + m) / 2 - a && (n + m) / 2 - a <= m)
		for (int i = 0; i <= n; ++i)
				ant = add(ant, dp[1][(n + m) / 2 - a][i]);

		swap(dp[0], dp[1]);
		for (auto &v: dp[1])
			fill(begin(v), end(v), 0); }

	fo << ant << endl;

	return 0; }