Cod sursa(job #960624)

Utilizator primulDarie Sergiu primul Data 10 iunie 2013 20:28:17
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 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;
}