Cod sursa(job #48765)

Utilizator VmanDuta Vlad Vman Data 5 aprilie 2007 01:15:27
Problema Iv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define Lmax 524
#define modulo 3210121

char c1[Lmax],c2[Lmax];
long a[Lmax][Lmax][Lmax],sum;
short int l1,l2,p1,p2,p3,p4,i;

int main()
{
 freopen("iv.in","r",stdin);
 scanf("%s",c1);
 scanf("%s",c2);
 l1=strlen(c1);
 l2=strlen(c2);
 for (i=l1;i>0;--i)
     c1[i]=c1[i-1];
 for (i=l2;i>0;--i)
     c2[i]=c2[i-1];

 /*if (c1[0]==c1[l1]) ++a[1][0][l1];
 if (c1[0]==c2[l2]) ++a[1][0][l1+1];
 if (c2[0]==c1[l1]) ++a[0][1][l1];
 if (c2[0]==c2[l2]) ++a[0][1][l1+1];*/
 a[0][0][l1+1]=1;

 for (p1=0;p1<=l1;++p1)
     for (p2=0;p2<=l2;++p2)
	 for (p3=l1+1;p3>p1;--p3)
	     {
	     //l1+l2+2-p3-p4+2=p1+p2;
	     p4=l1+l2+2-p1-p2-p3;
	     if (p4<p2) continue;
	     if (p4>l2+1) break;
	     //
	     if ((p1>0)&&(p3<=l1)&&(c1[p1]==c1[p3])&&(p2!=p4)) a[p1][p2][p3]+=a[p1-1][p2][p3+1];
	     if ((p1>0)&&(p4<=l2)&&(c1[p1]==c2[p4])) a[p1][p2][p3]+=a[p1-1][p2][p3];
	     if ((p2>0)&&(p3<=l1)&&(c2[p2]==c1[p3])) a[p1][p2][p3]+=a[p1][p2-1][p3+1];
	     if ((p2>0)&&(p4<=l2)&&(c2[p2]==c2[p4])&&(p1!=p3)) a[p1][p2][p3]+=a[p1][p2-1][p3];
	     a[p1][p2][p3]%=modulo;
	     if ((p3-p1<=1)&&(p4-p2<=1))
                {
                sum+=a[p1][p2][p3];
                sum%=modulo;
                }
             }
 freopen("iv.out","w",stdout);
 printf("%ld",sum);
 fclose(stdout);
 return 0;
}