Cod sursa(job #2938557)

Utilizator lolismekAlex Jerpelea lolismek Data 12 noiembrie 2022 11:16:48
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("iv.in");
ofstream fout("iv.out");

const int NMAX = 500;
const int MOD = 3210121;

int dp[2][NMAX + 1][NMAX + 1];

int main(){

	string s1, s2;
	fin >> s1 >> s2;

	int n1 = s1.size();
	int n2 = s2.size();

	s1 = "$" + s1;
	s2 = "$" + s2;

	dp[0][0][0] = 1;

	int ans = 0;
	int ind = 0;

	for(int i = 0; i <= n1; i++){
		for(int j = 0; i + j <= n1; j++)
			for(int k = 0; k <= n2; k++){
				int l = i + k - j; // optimizare cu un factor de N

				if(l < 0 || l + k > n2)
					continue;

				if(i + j + k + l == n1 + n2 || i + j + k + l == n1 + n2 - 1)
					(ans += dp[ind][j][k]) %= MOD;

				if(s1[i + 1] == s1[n1 - j])
					(dp[1 - ind][j + 1][k] += dp[ind][j][k]) %= MOD;

				if(l < n2 && s1[i + 1] == s2[n2 - l])
					(dp[1 - ind][j][k] += dp[ind][j][k]) %= MOD;

				if(s2[k + 1] == s1[n1 - j])
					(dp[ind][j + 1][k + 1] += dp[ind][j][k]) %= MOD;

				if(l < n2 && s2[k + 1] == s2[n2 - l])
					(dp[ind][j][k + 1] += dp[ind][j][k]) %= MOD;

				dp[ind][j][k] = 0;
			}
		ind = 1 - ind;
	}

	fout << ans << '\n';

	return 0;
}