Cod sursa(job #143182)

Utilizator allynaAlina S allyna Data 26 februarie 2008 00:05:51
Problema Iv Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<fstream.h>
#include<string.h>
#define Nmax 55
#define konst 3210121
int long nr[Nmax][Nmax],nr1[Nmax][Nmax];
int n1,n2;
char s2[Nmax],s1[Nmax];
void citire();
void afisare();


void initializare()
{if(s2[1]==s2[n2])
   nr1[1][1]=1;
 if(s2[1]==s1[n1])
   nr1[1][0]=1;
 if(s1[1]==s2[n2])
   nr1[0][1]=1;
 if(s1[1]==s1[n1])
   nr1[0][0]=1;
 }


void dinamica()
{int i,a,b;
 for(i=2;i<=(n1+n2)/2;i++)
  {memset(nr,0,sizeof(nr));
  for(a=0;a<=n2&&a<=i;a++)
   for(b=0;b<=n2-a;b++)
	{if(s1[i-a]==s1[n1-i+b+1]&&i-a>0&&i-a<=n1&&n1-i+b+1>0&&n1-i+b+1<=n1)
	   nr[a][b]=(nr1[a][b]+nr[a][b])%konst;

	 if(s2[a]==s1[n1-i+b+1]&&a>0&&n1-i+b+1>0&&n1-i+b+1<=n1)
	   nr[a][b]=(nr[a][b]+nr1[a-1][b])%konst;

	 if(s1[i-a]==s2[n2-b+1]&&i-a>0&&i-a<=n1&&n2-b+1>0&&n2-b+1<=n2&&b>0)
	   nr[a][b]=(nr1[a][b-1]+nr[a][b])%konst;

	 if(s2[a]==s2[n2-b+1]&&a>0&&b>0&&n2-b+1>0)
	   nr[a][b]=(nr[a][b]+nr1[a-1][b-1])%konst;









	 }
  memcpy(nr1,nr,sizeof(nr));
  }

}



int main()
{citire();
 initializare();
 dinamica();
 afisare();
 return 0;
 }

void citire()
{char s3[Nmax];
 ifstream f("iv.in");
 f>>s1>>s2;
 n1=strlen(s1);
 n2=strlen(s2);

 s3[0]='1';s3[1]=NULL;
 strcat(s3,s1);
 memcpy(s1,s3,sizeof(s3));
 s3[0]='1';s3[1]=NULL;
 strcat(s3,s2);
 memcpy(s2,s3,sizeof(s3));
}

void afisare()
{int i,j;
int long sol=0;
ofstream g("iv.out");
for(i=0;i<=n2;i++)
  sol=(sol+nr1[i][n2-i])%konst;
if((n1+n2)%2)
   for(i=0;i<n2;i++)
	sol=(sol+nr1[i][n2-i-1])%konst;
 g<<sol;
 g.close();
 }