Cod sursa(job #12052)

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

#define maxn 20
#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-(i-k);
                  
				  if ((x>0) && (y>0) && (x<=n) && (y<=n) && (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 ((z>0) && (z<=m) && (y>0) && (y<=n) && (x>0) && (t>0) && (x<=n) && (t<=m))
                  {
                      if (a[x]==b[t])
    				  {
    					 c[j+1][k]+=d[j][k];
    					 if (c[j+1][k]>mod) c[j+1][k]-=mod;
    				  }
                      
                      if (a[y]==b[z])
 	                  {
					      c[j][k+1]+=d[j][k];
					      if (c[j][k+1]>mod) c[j][k+1]-=mod;
		              }
                  }

				  if ((z>0) && (t>0) && (z<=m) && (t<=m) & (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;
}