Cod sursa(job #3170559)

Utilizator divadddDavid Curca divaddd Data 17 noiembrie 2023 19:18:49
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>
using namespace std;
const int MOD = 3210121;
const int NMAX = 502;
int n,m;
string a,b;

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

struct Mint {
    int val;
    Mint(){}
    Mint(int x){
        val = x;
    }
    Mint operator + (const Mint &aux) const {
        Mint ans;
        ans.val = (val+aux.val)%MOD;
        return ans;
    }
    Mint operator += (const Mint &aux) {
        val = (val+aux.val)%MOD;
        return *this;
    }
    void afis(){
        fout << val << "\n";
    }
} dp[2][NMAX][NMAX];;

int main()
{
    fin >> a >> b;
    n = a.size(), m = b.size();
    a = "$"+a;
    b = "$"+b;
    dp[0][0][0] = 1;
    int half = (n+m)/2;
    for(int i = 1; i <= (n+m)/2; i++){
        int curr = (i&1), prev = !curr;
        memset(dp[curr], 0, sizeof(dp[curr]));
        for(int p1 = 0; p1 <= n && p1 <= i; p1++){
            for(int q1 = 0; p1+q1 <= n && q1 <= i; q1++){
                int p2 = i-p1;
                int q2 = i-q1;
                if(a[p1] == a[n-q1+1]){
                    dp[curr][p1][q1] += dp[prev][p1-1][q1-1];
                }
                if(a[p1] == b[m-q2+1]){
                    dp[curr][p1][q1] += dp[prev][p1-1][q1];
                }
                if(b[p2] == a[n-q1+1]){
                    dp[curr][p1][q1] += dp[prev][p1][q1-1];
                }
                if(b[p2] ==  b[m-q2+1]){
                    dp[curr][p1][q1] += dp[prev][p1][q1];
                }
            }
        }
    }
    Mint ans = 0;
    if((n+m)%2 == 0){
        for(int i = 0; i <= n; i++){
            ans += dp[half&1][i][n-i];
        }
    }else{
        for(int i = 0; i <= n; i++){
            ans += dp[half&1][i][n-i-1] + dp[half&1][i][n-i];
        }
    }
    ans.afis();
    return 0;
}