Cod sursa(job #3250500)

Utilizator tudor_costinCostin Tudor tudor_costin Data 21 octombrie 2024 15:40:22
Problema Iv Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;
#define int long long
ifstream fin("iv.in");
ofstream fout("iv.out");
const int Nmax=505,mod=3210121;
int dp[Nmax][Nmax][Nmax];
signed main()
{
    string a,b;
    fin>>a>>b;
    int A=signed(a.size());
    int B=signed(b.size());
    int n=A+B;
    dp[0][0][0]=1;
    int sol=0;
    for(int i=1;i<=n/2;i++)
    {
        for(int x=0;x<=i && x<=A;x++)
        {
            if(i-x>B) continue;
            for(int y=0;x+y<=A && y<=i;y++)
            {
                if(i-y>B || 2*i-x-y>B) continue;
                int x2=i-x;
                int y2=i-y;
                int pozx=x-1,pozy=A-y,pozx2=x2-1,pozy2=B-y2;
                dp[i][x][y]=0;
                if(pozx>=0 && pozy<A && a[pozx]==a[pozy]) dp[i][x][y]=(dp[i][x][y]+dp[i-1][x-1][y-1])%mod;
                if(pozx>=0 && pozy2<B && a[pozx]==b[pozy2]) dp[i][x][y]=(dp[i][x][y]+dp[i-1][x-1][y])%mod;
                if(pozx2>=0 && pozy<A && b[pozx2]==a[pozy]) dp[i][x][y]=(dp[i][x][y]+dp[i-1][x][y-1])%mod;
                if(pozx2>=0 && pozy2<B && b[pozx2]==b[pozy2]) dp[i][x][y]=(dp[i][x][y]+dp[i-1][x][y])%mod;
                if(i==n/2) sol=(sol+dp[i][x][y])%mod;
            }
        }
    }
    fout<<sol<<'\n';
    return 0;
}