Cod sursa(job #563307)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 24 martie 2011 21:53:25
Problema Iv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <stdio.h>
#define MOD 3210121
#define NMAX 205
char A[NMAX],B[NMAX];
int n,m,C[NMAX][NMAX][NMAX],rez;
inline int lit(char x)
{
	return x>='a' && x<='z';
}
void read()
{
	fgets(A+1,NMAX,stdin);
	fgets(B+1,NMAX,stdin);
	while (lit(A[n+1])) n++;
	while (lit(B[m+1])) m++;
}
void solve()
{
	C[0][0][0]=1;
	int i,j,k,poz,val=(n+m)/2+(n+m)%2;
	for (i=0; i<=n && i<=val; i++)
	{
		for (j=0; j<=m && j<=val-i; j++)
			for (k=0; k<=n && k<=val; k++)
				if (i+j<=m+k && i+j<val)
				{
					poz=i+j-k;
					if (A[i+1]==A[n-k-1])
					{
						C[i+1][j][k+1]+=C[i][j][k];
						if (C[i+1][j][k+1]>=MOD)
							C[i+1][j][k+1]-=MOD;
					}
					if (A[i+1]==B[m-poz-1])
					{
						C[i+1][j][k]+=C[i][j][k];
						if (C[i+1][j][k]>=MOD)
							C[i+1][j][k]-=MOD;
					}
					if (B[j+1]==A[n-k-1])
					{
						C[i][j+1][k+1]+=C[i][j][k];
						if (C[i][j+1][k+1]>=MOD)
							C[i][j+1][k+1]-=MOD;
					}
					if (B[j+1]==B[m-poz-1])
					{
						C[i][j+1][k]+=C[i][j][k];
						if (C[i][j+1][k]>=MOD)
							C[i][j+1][k]-=MOD;
					}
				}
		for (j=0; j<=n && j<=val; j++)
		{
			poz=val-i;
			//if (val-j<=m && val-i<=m && val-j+poz==m)
				rez+=C[i][val-i][j];
			if (rez>=MOD)
				rez-=MOD;
		}
	}
}
int main()
{
	freopen("iv.in","r",stdin);
	freopen("iv.out","w",stdout);
	read();
	solve();
	printf("%d\n",rez);
	return 0;
}