Cod sursa(job #1608377)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 22 februarie 2016 00:32:50
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<cstdio>
#include<cstring>
#define MOD 3210121
int n,m,l,i,j,a,b,ss,d[510][510],d1[510][510];
char s[510],t[510];
FILE *f,*g;
int main(){
    f=fopen("iv.in","r");
    g=fopen("iv.out","w");
    fscanf(f,"%s\n%s",s+1,t+1);
    n=strlen(s+1);
    m=strlen(t+1);
    d[0][0]=1;
    for( l=1; l<=(n+m)/2; l++ ){
        for( i=0; i<=l; i++ ){
            for( j=0; j <= l && i + j <= n; j++ ){
                a=l-i-1;
                b=l-j-1;
                if( i + j <= n - 2 && s[ n - j ] == s[ i + 1 ] )
                    d1[ i + 1 ][ j + 1 ] = d[i][j] % MOD;
                if( i + j <= n - 1 && a + b <= m - 1 && s[ i + 1 ] == t[ m - b ] )
                    d1[ i + 1 ][j] = ( d1[ i+1 ][j] + d[i][j] ) % MOD;
                if( i + j <= n - 1 && a + b <= m - 1 && s[ n - j ] == t[ a + 1 ] )
                    d1[i][ j + 1 ] = ( d1[i][ j + 1 ] + d[i][j] ) % MOD;
                if( a + b <= m - 2 && t[ a + 1 ] == t[ m - b ] )
                    d1[i][j] = ( d1[i][j] + d[i][j] ) % MOD;
            }
        }
        for(i=0; i<=l; i++ ){
            for(j=0; j<=l; j++ ){
                d[i][j] = d1[i][j];
                d1[i][j] = 0;
            }
        }
    }
    for(i=0; i<=n; i++){
        for(j=0; j<=n; j++ ){
            if( i + j <= n )
                ss = ( ss + d[i][j] ) % MOD;
        }
    }
    fprintf(g,"%d",ss);

    fclose(f);
    fclose(g);
    return 0;
}