Cod sursa(job #563348)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 24 martie 2011 22:49:58
Problema Iv Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
#include <string.h>
#define MOD 3210121
#define NMAX 505
char A[NMAX],B[NMAX];
int n,m,C[2][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 add(int a,int b,int c,int val)
{
	C[a][b][c]+=val;
	if (C[a][b][c]>=MOD)
		C[a][b][c]-=MOD;
}
void solve()
{
	C[0][0][0]=1;
	int i,j,k,poz,val=(n+m)/2,act,act2;
	for (i=0; i<=n && i<=val; i++)
	{
		act=i & 1; act2=(i+1) & 1;
		memset(C[act2],0,sizeof(C[act2]));
		for (j=0; j<=m && j<=val-i; j++)
			for (k=0; k<=n-i && k<=val; k++)
			{
				poz=i+j-k;
				if (A[i+1]==A[n-k])
					add(act2,j,k+1,C[act][j][k]);
				if (A[i+1]==B[m-poz])
					add(act2,j,k,C[act][j][k]);
				if (B[j+1]==A[n-k])
					add(act,j+1,k+1,C[act][j][k]);
				if (B[j+1]==B[m-poz])
					add(act,j+1,k,C[act][j][k]);
			}
		if (val-i<=m)
		{
			rez+=C[act][val-i][n-i];
			if (rez>=MOD)
				rez-=MOD;
			if ((n+m) & 1)
				rez+=C[act][val-i][n-i+1];
		}
		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;
}