Cod sursa(job #2278143)

Utilizator cipri321Marin Ciprian cipri321 Data 7 noiembrie 2018 12:50:54
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 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^=1)
		for(int p2=0;p2<=b;p2++)
			for(int q1=0;q1<=a-p1;q1++)
			{
				int q2=p1+p2-q1;
				if(q2<0)continue;
				if(p1+q1+1<a && A[p1+1]==A[a-q1])
					add(dp[ind^1][p2][q1+1],dp[ind][p2][q1]);
				if(p2+q2+1<b && B[p2+1]==B[b-q2])
                	add(dp[ind][p2+1][q1],dp[ind][p2][q1]);
                if(p1+q1<a && p2+q2<b)
                {
                	if(A[p1+1]==B[b-q2])
                		add(dp[ind^1][p2][q1],dp[ind][p2][q1]);
                	if(B[p2+1]==A[a-q1])
                		add(dp[ind][p2+1][q1+1],dp[ind][p2][q1]);
                }    
                if((p1+q1==a && p2+q2==b) || (p1+q1==a-1 && p2+q2==b) || (p1+q1==a && p2+q2==b-1))
                    rez=(rez+dp[ind][p2][q1])%MOD;
                dp[ind][p2][q1]=0;
			}
	fo<<rez;
	fi.close();
	fo.close();
	return 0;
}