Cod sursa(job #2278120)

Utilizator cipri321Marin Ciprian cipri321 Data 7 noiembrie 2018 12:13:25
Problema Iv Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <fstream>
#include <cstring>
#define DIM 505
#define MOD 3210121
using namespace std;
ifstream fi("iv.in");
ofstream fo("iv.out");
char A[DIM],B[DIM];int a,b;
int dp[2][DIM][DIM],rez;
inline void add(int &a,int b)
{
	a+=b;
	if(a>=MOD)
		a-=MOD;
}
int main()
{
	fi>>(A+1)>>(B+1);
	a=strlen(A+1),b=strlen(B+1);
	dp[0][0][0]=1;
	for(int p1=0,ind=0;p1<=a;p1++,ind=ind^1)
		for(int p2=0;p2<=b;p2++)
			for(int q1=0;q1<=a;q1++)
			{
				int q2=p1+p2-q1;
				if(q2<0||p1+q1>a)break;
				if(p1+q1+1<a&&A[p1+1]==A[a-q1])
					add(dp[ind^1][p2][q1+1],dp[ind][p2][q1]);
				if(p1+q1<a&&p2+q2<b&&A[p1+1]==B[b-q2])
					add(dp[ind^1][p2][q1],dp[ind][p2][q1]);
				if(p1+q1<a&&p2+q2<b&&A[a-q1]==B[p2+1])
					add(dp[ind][p2+1][q1+1],dp[ind][p2][q1]);
				if(p2+q1+1<b&&B[p2+1]==B[b-q2])
					add(dp[ind][p2+1][q1],dp[ind][p2][q1]);

				int len=p1+q1+p2+q2;
				if((len==a+b||len==a+b-1)&&p2+q2<=b)
					add(rez,dp[ind][p2][q1]);
				dp[ind][p2][q1]=0;
			}
	fo<<rez;
	fi.close();
	fo.close();
	return 0;
}