Cod sursa(job #12059)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 2 februarie 2007 20:41:13
Problema Iv Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <stdio.h>
#define maxx 510
#define mod 3210121
#define maxalf 30


char a[maxx],b[maxx],aux[maxx];
int c[maxx][maxx],d[maxx][maxx],n,m,count[maxalf],count2[maxalf],sol,l,p,q;
int first;

void citire()
{

    int i,j,k;
    freopen("iv.in","r",stdin);
    
	 n=0;
    do
    {
      n++;
      scanf("%c",& a[n]);
      
    }    
    while (a[n]!='\n'); 
    n--;

	 m=0;
	 do
	 {
		m++;
		scanf("%c",& b[m]);
	 }
	 while (b[m]!='\n');
	 m--;

}

void calc(int i,int j,int k)
{
	 l=n-k+1;
	 q=k+m-i+1;

	 if (p<q)
	 {
		  if (a[j]==a[l]) c[j][l]=(c[j][l]+d[j-1][l+1])%mod;
		  if (a[j]==b[q]) c[j][l]=(c[j][l]+d[j-1][l])%mod;
          if (b[p]==a[l]) c[j][l]=(c[j][l]+d[j][l+1])%mod; 
          if (b[p]==b[q]) c[j][l]=(c[j][l]+d[j][l])%mod;
    }        
        
}    

void rezolva()
{
    d[0][n+1]=1;
    d[0][n]=1;
    d[1][n]=1;
	 d[1][n+1]=1;
	 int i,j,k;

	 for (i=1;i<=(n+m)/2;i++)
		{
			 for (j=0;j<=n+1;j++)
				for (k=0;k<=n+1;k++) c[j][k]=0;

			 if (i<=n)
				for (j=0;j<=i;j++)
				{
					p=i-j;
					if (i<=n-j)
						for (k=0;k<=i;k++) calc(i,j,k);
					else for (k=0;k<=n-j;k++) calc(i,j,k);
				}
			 else for(j=0;j<=n;j++)
				{
					 p=i-j;
					 if (i<=n-j)
						for (k=0;k<=i;k++) calc(i,j,k);
					 else for (k=0;k<=n-j;k++) calc(i,j,k);
				}
      }    
      
  sol=0;
      

  for (i=0;i<=n+1;i++) sol=(sol+c[i][i+2])%mod;
  for (i=0;i<=n+1;i++) sol=(sol+c[i][i+1])%mod;

}    

void afisare()
{
   freopen("iv.out","w",stdout);
   
   printf("%d\n",sol);
}

int main()
{
  citire();
  
  rezolva();
  
  afisare();

  return 0;
}