Cod sursa(job #384867)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 21 ianuarie 2010 16:12:47
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
#include<string.h>
#define mod 3210121
int n,m,d[2][505][505];
char s1[505],s2[505];

void adun(int i1, int j1, int k1, int i2, int j2, int k2)
{
	d[i1][j1][k1]=(d[i1][j1][k1]+d[i2][j2][k2])%mod;
}

int main()
{
	freopen("iv.in","r",stdin);
	freopen("iv.out","w",stdout);
	gets(s1+1);
	gets(s2+1);
	n=strlen(s1+1);
	m=strlen(s2+1);
	int i,j,k,lim=(n+m)/2;
	d[0][0][0]=1;
	for(i=0;i<lim;i++)
	{
		for(j=0;j<=n;j++)
			for(k=0;k<=n;k++)
				if(d[i&1][j][k])
				{
					if(j+1<n-k)
						if(s1[j+1]==s1[n-k])
							adun(i+1&1,j+1,k+1,i&1,j,k);
					if(i-j+1<m-i+k)
						if(s2[i-j+1]==s2[m-i+k])
							adun(i+1&1,j,k,i&1,j,k);
					if(j+1<n-k+1 && i-j+1<m-i+k+1)
					{
						if(s1[j+1]==s2[m-i+k])
							adun(i+1&1,j+1,k,i&1,j,k);
						if(s1[n-k]==s2[i-j+1])
							adun(i+1&1,j,k+1,i&1,j,k);
					}
					printf("");
				}
		memset(d[i&1],0,sizeof(d[i&1]));
	}
	int sol=0;
	for(i=0;i<2;i++)
		for(j=0;j<=n;j++)
			for(k=0;k<=n;k++)
				sol=(sol+d[i][j][k])%mod;
	printf("%d\n",sol);
	return 0;
}