Cod sursa(job #12073)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 2 februarie 2007 21:19:22
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <string.h>

#define maxn 510
#define mod 3210121

char a[maxn],b[maxn];
int n,m,sol;
int c[maxn][maxn],d[maxn][maxn];

void move(char a[],int n)
{
     int i;
     for (i=n;i>0;i--) a[i]=a[i-1];
     a[0]=' ';
}

int main()
{
    freopen("iv.in","r",stdin);
    freopen("iv.out","w",stdout);
    
    fgets(a,maxn,stdin);
    fgets(b,maxn,stdin);
    n=strlen(a)-1;
    move(a,n);
    m=strlen(b)-1;
    move(b,m);
    
    int i,j,k,x,y,z,t;
    
    c[0][0]=1;
    
    for (i=0;i<(n+m)/2;i++)
    {
        for (j=0;j<=i && j<=n;j++)
		  for (k=0;k<=i && k<=n;k++)
          {
              d[j][k]=c[j][k];
              c[j][k]=0; 
          }        
        
        for (j=0;j<=i && j<=n;j++)
		  for (k=0;k<=i && k<=n;k++)
			if (d[j][k]!=0)
			{
				x=j+1;
				y=n-k;
				z=i-j+1;
				t=m+k-i;

				if ((x<y) && (a[x]==a[y]))
				{
					c[j+1][k+1]+=d[j][k];
					if (c[j+1][k+1]>mod) c[j+1][k+1]-=mod;
				}
				if ((x<=y) && (z<=t) && (a[x]==b[t]))
				{
					  c[j+1][k]+=d[j][k];
					  if (c[j+1][k]>mod) c[j+1][k]-=mod;
				}
				if ((x<=y) && (z<=t) && (b[z]==a[y]))
				{
					  c[j][k+1]+=d[j][k];
					  if (c[j][k+1]>mod) c[j][k+1]-=mod;
				}
				if ((z<t) && (b[z]==b[t]))
				{
					  c[j][k]+=d[j][k];
					  if (c[j][k]>mod) c[j][k]-=mod;
				}
			}
	}

	for (i=0;i<=n;i++)
	  for (j=0;j<=n;j++)
	  {
		  sol+=c[i][j];
		  if (sol>mod) sol-=mod;
	  }

	printf("%d\n",sol);

	return 0;
}