Cod sursa(job #2253072)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 3 octombrie 2018 16:48:39
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <cstdio>
#define MOD 3210121
#define DIM 501

using namespace std;
char v[DIM],w[DIM];
int d[2][DIM][DIM];
int main()
{
    FILE *fin=fopen ("iv.in","r");
    FILE *fout=fopen ("iv.out","w");
    int n,m,t,k,i,j,s,ai,as,bi,bs;
    char c;
    n=m=0;
    c=fgetc (fin);
    while (c!='\n'){
        v[++n]=c;
        c=fgetc (fin);
    }
    c=fgetc (fin);
    while (c!='\n'){
        w[++m]=c;
        c=fgetc (fin);
    }
    /// d[t][i][j] la pasul t, nr palind cu i de la int lui v si j de la sf lui v
    t=1;
    if (v[1]==v[n])
        d[0][1][1]=1;
    if (v[1]==w[m])
        d[0][1][0]=1;
    if (w[1]==v[n])
        d[0][0][1]=1;
    if (w[1]==w[m])
        d[0][0][0]=1;
    for (k=2;k<=(n+m)/2;k++){
        for (i=0;i<=n && i<=k;i++)
            for (j=0;j+i<=n && j<=k;j++){
                //if (i==0 && j==2)
                  //  printf ("a");
                ai=i;
                as=n-j+1;
                bi=k-i;
                bs=m-(k-j)+1;
                d[t][i][j]=0;

                if (ai>0 && as<=n && v[ai]==v[as])
                    d[t][i][j]=(d[t][i][j]+d[1-t][i-1][j-1])%MOD;
                if (ai>0 && bs<=m && v[ai]==w[bs])
                    d[t][i][j]=(d[t][i][j]+d[1-t][i-1][j])%MOD;
                if (bi>0 && bs<=m && w[bi]==w[bs])
                    d[t][i][j]=(d[t][i][j]+d[1-t][i][j])%MOD;
                if (bi>0 && as<=n && w[bi]==v[as])
                    d[t][i][j]=(d[t][i][j]+d[1-t][i][j-1])%MOD;
                //if (k==2)
                  //  printf ("%d %d %d\n",i,j,d[t][i][j]);
            }
        t=1-t;
    }
    t=1-t;
    s=0;
    if ((n+m)%2==0){
        for (i=0;i<=n;i++)
            s=(s+d[t][i][n-i])%MOD;
    }
    else {
        for (i=0;i<n;i++)
            s=(s+d[t][i][n-i-1]+d[t][i][n-i])%MOD;
    }
    fprintf (fout,"%d",s);
    return 0;
}