Cod sursa(job #1936157)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 22 martie 2017 21:28:53
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <cstdio>
#include <cstring>

#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;
}