Cod sursa(job #2277239)

Utilizator vladcoroian2001Vlad Coroian vladcoroian2001 Data 5 noiembrie 2018 21:35:43
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <cstring>

using namespace std;
ifstream fi("iv.in");
ofstream fo("iv.out");
const int NMAX=505,MOD=3210121;
string a,b;
int n,m,dp[NMAX][NMAX][NMAX],sol,r;
int main()
{
	fi>>a>>b;
	n=a.size();
	m=b.size();
	a="#"+a; b="#"+b;
	dp[0][0][0]=1;
	for(int sa=0;sa<=n;sa++)
	{
		r=sa%2;
		for(int sb=0;sb<=m;sb++)
			for(int fa=0;fa<=n-sa;fa++)
			{
				int fb=sa+sb-fa;
				if(fb<0) 
					continue;
				if(sa+1<=n-fa-1 && a[sa+1]==a[n-fa])
					dp[1-r][sb][fa+1]=(dp[1-r][sb][fa+1]+dp[r][sb][fa])%MOD;
				if(sa+1<=n-fa && sb<=m-fb-1 && a[sa+1]==b[m-fb])
					dp[1-r][sb][fa]=(dp[1-r][sb][fa]+dp[r][sb][fa])%MOD;
				if(sb+1<=m-fb && sa<=n-fa-1 && b[sb+1]==a[n-fa])
					dp[r][sb+1][fa+1]=(dp[r][sb+1][fa+1]+dp[r][sb][fa])%MOD;
				if(sb+1<=m-fb-1 && b[sb+1]==b[m-fb])
					dp[r][sb+1][fa]=(dp[r][sb+1][fa]+dp[r][sb][fa])%MOD;
				int lga=sa+fa;
				int lgb=sb+fb;
				if((lga==n && lgb==m) || (lga==n-1 && lgb==m) || (lga==n && lgb==m-1))
					sol=(sol+dp[r][sb][fa])%MOD;
				dp[r][sb][fa]=0;
			}
	}
	fo<<sol<<"\n";
	fi.close();
	fo.close();
	return 0;
}