Cod sursa(job #638717)

Utilizator popefloPopescu Florin popeflo Data 21 noiembrie 2011 14:48:27
Problema Iv Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>
#include<string.h>

#define MOD 3210121
#define NMAX 505

int nr1,nr2,sol;
int d[2][NMAX][NMAX];
char s1[NMAX],s2[NMAX];

int main ()
{
	int i,j,k,t;

	freopen("iv.in","r",stdin);
	freopen("iv.out","w",stdout);

	scanf("%s",s1);
	nr1=strlen(s1);
	for(i=nr1;i>=1;i--)
		s1[i]=s1[i-1];

	scanf("%s",s2);
	nr2=strlen(s2);
	for(i=nr2;i>=1;i--)
		s2[i]=s2[i-1];

	for(i=0;i<=nr1;i++)
	{
		memset(d[i&1],0,sizeof(d[i&1]));
		if(!i)
			d[0][0][0]=1;
		for(j=0;i+j<=nr1;j++)
			for(k=0;k<=nr2;k++)
			{
				if((!i && !j && !k) || i+k<j)
					continue;
				t=i+k-j;	
				if(k+t>nr2)
					continue;

				d[i&1][j][k]=0;
				if(i && j && s1[i]==s1[nr1-j+1])
					d[i&1][j][k]+=d[(i-1)&1][j-1][k];

				if(i && t && s1[i]==s2[nr2-t+1])
				{
					d[i&1][j][k]+=d[(i-1)&1][j][k];
					//printf("d[%d][%d][%d][%d]:%d\n",i,j,k,t,d[i&1][j][k]);
				}	

				if(k && j && s2[k]==s1[nr1-j+1])
					d[i&1][j][k]+=d[i&1][j-1][k-1];

				if(k && t && s2[k]==s2[nr2-t+1])
					d[i&1][j][k]+=d[i&1][j][k-1];
				
				if(d[i&1][j][k]>=MOD)
					d[i&1][j][k]%=MOD;

				//printf("d[%d][%d][%d][%d]=%d\n",i,j,k,t,d[i&1][j][k]);

				if(((nr1+nr2)&1==0) && (i+j==nr1) && (k+t==nr2))
				{
					sol+=d[i&1][j][k];
					if(sol>=MOD)
						sol-=MOD;
				}
				else if((nr1+nr2)&1==1 && ((i+j==nr1 && k+t==nr2-1) || (i+j==nr1-1 && k+t==nr2)))
				{
					sol+=d[i&1][j][k];
					if(sol>=MOD)
						sol-=MOD;
				}
			}
	}	

	printf("%d\n",sol);
	return 0;
}