Cod sursa(job #791190)

Utilizator ChallengeMurtaza Alexandru Challenge Data 23 septembrie 2012 12:26:45
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <cstring>

using namespace std;

const char InFile[]="iv.in";
const char OutFile[]="iv.out";
const int MaxN=512;
const int MOD=3210121;

ifstream fin(InFile);
ofstream fout(OutFile);

int N,M,D1[MaxN][MaxN],D2[MaxN][MaxN];
char str1[MaxN],str2[MaxN];

inline void MODf(int &x)
{
	if(x>=MOD)
	{
		x-=MOD;
	}
}

int main()
{
	fin>>str1+1>>str2+1;
	fin.close();
	
	N=strlen(str1+1);
	M=strlen(str2+1);

	D1[0][0]=1;
	int side=(N+M)>>1;
	for(register int i=0;i<side;++i)
	{
		for(register int st1=0;st1<=i;++st1)
		{
			for(register int dr1=0;dr1<=i && st1+dr1<=N;++dr1)
			{
				int st2=i-st1;
				int dr2=i-dr1;
				if(st1+dr1<N)
				{
					if(st1+dr1<N-1)
					{
						if(str1[st1+1]==str1[N-dr1])
						{
							D2[st1+1][dr1+1]+=D1[st1][dr1];
							MODf(D2[st1+1][dr1+1]);
						}
					}

					if(st2+dr2<M)
					{
						if(str1[st1+1]==str2[M-dr2])
						{
							D2[st1+1][dr1]+=D1[st1][dr1];
							MODf(D2[st1+1][dr1]);
						}
					}
				}

				if(st2+dr2<M)
				{
					if(st2+dr2<M-1)
					{
						if(str2[st2+1]==str2[M-dr2])
						{
							D2[st1][dr1]+=D1[st1][dr1];
							MODf(D2[st1][dr1]);
						}
					}

					if(st1+dr1<N)
					{
						if(str2[st2+1]==str1[N-dr1])
						{
							D2[st1][dr1+1]+=D1[st1][dr1];
							MODf(D2[st1][dr1+1]);
						}
					}
				}
			}
		}
		for(register int st1=0;st1<=i+1;++st1)
		{
			for(register int dr1=0;dr1<=i+1 && st1+dr1<=N;++dr1)
			{
				D1[st1][dr1]=D2[st1][dr1];
				D2[st1][dr1]=0;
			}
		}
	}

	int sol=0;
	for(register int st1=0;st1<=side;++st1)
	{
		for(register int dr1=0;dr1<=side && st1+dr1<=N;++dr1)
		{
			sol+=D1[st1][dr1];
			MODf(sol);
		}
	}
	
	fout<<sol;
	fout.close();
	return 0;
}