Cod sursa(job #2377470)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 10 martie 2019 13:12:07
Problema Iv Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 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, 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);

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

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

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

		} }

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

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

	fo << ant << endl;

	return 0; }