Cod sursa(job #1775327)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 10 octombrie 2016 11:16:37
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<fstream>
#include<cstring>
#define mod 3210121
using namespace std;
int n, m, i, ii, j, jj, x, k, sol;
int d[2][505][505];
char a[505], b[505];
ifstream fin("iv.in");
ofstream fout("iv.out");
int modul(int x){
    if(x >= mod){
        x -= mod;
    }
    return x;
}
int main(){
    fin>> a + 1;
    n = strlen(a + 1);
    fin>> b + 1;
    m = strlen(b + 1);
    x = (n + m) / 2;
    d[0][0][n + 1] = 1;
    for(i = 0; i <= min(n, x); i++){
        for(j = 0; j <= min(m, x - i); j++){
            for(ii = n + 1; ii > i; ii--){
                jj = m - (i + j - (n - ii + 1)) + 1;
                if(a[i + 1] == a[ii - 1] && i + 1 < ii - 1){
                    d[1 - k][j][ii - 1] = modul(d[1 - k][j][ii - 1] + d[k][j][ii]);
                }
                if(a[i + 1] == b[jj - 1] && i + 1 < ii && jj - 1 > j){
                    d[1 - k][j][ii] = modul(d[1 - k][j][ii] + d[k][j][ii]);
                }
                if(b[j + 1] == b[jj - 1] && j + 1  < jj - 1){
                    d[k][j + 1][ii] = modul(d[k][j + 1][ii] + d[k][j][ii]);
                }
                if(b[j + 1] == a[ii - 1] && j + 1 < jj && ii - 1 > i){
                    d[k][j + 1][ii - 1] = modul(d[k][j + 1][ii - 1] + d[k][j][ii]);
                }
                if(i + j == x){
                    sol = modul(sol + d[k][j][ii]);
                }
                d[k][j][ii] = 0;
            }
        }
        k = 1 - k;
    }
    fout<< sol <<"\n";
    return 0;
}