Cod sursa(job #1728558)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 13 iulie 2016 10:39:21
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
#define MAXN 500
#define MOD 3210121
char a[MAXN+2], b[MAXN+2];
int d[2][MAXN+2][MAXN+2];
inline void sum(int &a, int b){
    a+=b;
    if(a>=MOD) a-=MOD;
}
int main(){
    int n, m, i, j, p, q, l, ans;
    char ch;
    FILE *fin, *fout;
    fin=fopen("iv.in", "r");
    fout=fopen("iv.out", "w");
    ch=fgetc(fin);
    n=0;
    while(ch!='\n'){
        a[++n]=ch;
        ch=fgetc(fin);
    }
    ch=fgetc(fin);
    m=0;
    while(ch!='\n'){
        b[++m]=ch;
        ch=fgetc(fin);
    }
    a[0]='!';
    b[0]='@';
    a[n+1]='#';
    b[m+1]='$';
    d[0][0][0]=1;
    ans=0;
    for(i=0, l=0; i<=n; i++, l=1-l) for(j=0; i+j<=n; j++) for(p=0; p<=m; p++){
        q=i+p-j;
        if((q>=0)&&(p+q<=m)&&(d[l][j][p]>0)){
            if(i+j+p+q>=n+m-1) sum(ans, d[l][j][p]);
            else{
                if(a[i+1]==a[n-j]) sum(d[1-l][j+1][p], d[l][j][p]);
                if(a[i+1]==b[m-q]) sum(d[1-l][j][p], d[l][j][p]);
                if(b[p+1]==a[n-j]) sum(d[l][j+1][p+1], d[l][j][p]);
                if(b[p+1]==b[m-q]) sum(d[l][j][p+1], d[l][j][p]);
            }
            d[l][j][p]=0;
        }
    }
    fprintf(fout, "%d\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}