Cod sursa(job #2484261)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 30 octombrie 2019 20:35:48
Problema Iv Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
#define MOD 3210121

using namespace std;

ifstream fin  ("iv.in");
ofstream fout ("iv.out");

int l1, l2, l, i, j, L, sol, t;
int d[505][505][505];

char a[505], b[505];

int main(){
    fin >> a + 1 >> b + 1;
    l1 = strlen (a + 1), l2 = strlen (b + 1), l = l1 + l2;
    if (a[1] == a[l1]){
        d[0][1][1] = 1;
    }
    if (b[1] == b[l2]){
        d[0][0][0] = 1;
    }
    if (a[1] == b[l2]){
        d[0][1][0] = 1;
    }
    if (b[1] == a[l1]){
        d[0][0][1] = 1;
    }
            t = 1;
    for (L=2; L<=l/2; L++){
        for (i=0; i<=l1 && i<=L; i++){
            for (j=0; j+i<=l1 && j<=L; j++){
                if(a[i] == a[l1-j+1] && i > 0 && j > 0){
                    d[t][i][j] += d[1-t][i-1][j-1];
                    d[t][i][j] %= MOD;
                }
                if(b[L-i] == b[l2-L+j+1] && i < L && j < L){
                    d[t][i][j] += d[1-t][i][j];
                    d[t][i][j] %= MOD;
                }
                if(a[i] == b[l2-L+j+1] && i > 0 && j < L){
                    d[t][i][j] += d[1-t][i-1][j];
                    d[t][i][j] %= MOD;
                }
                if(b[L-i]==a[l1-j+1] && i < L && j > 0){
                    d[t][i][j] += d[1-t][i][j-1];
                    d[t][i][j] %= MOD;
                }
            }
        }
        t = 1 - t;
    }
    if (l%2){
        for (i=0; i<l1; i++) {
            sol += d[1-t][i][l1-i-1];
            sol %= MOD;
            sol += d[1-t][i][l1-i];
            sol %= MOD;
        }
        fout << sol;
        return 0;
    }
    for (i=0; i<=l1; i++){
        sol += d[1-t][i][l1-i];
        sol %= MOD;
    }
    fout << sol;
    return 0;
}