Cod sursa(job #3250502)

Utilizator tudor_costinCostin Tudor tudor_costin Data 21 octombrie 2024 15:43:52
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 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],newdp[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]=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;
                newdp[x][y]=0;
                if(pozx>=0 && pozy<A && a[pozx]==a[pozy]) newdp[x][y]=(newdp[x][y]+dp[x-1][y-1])%mod;
                if(pozx>=0 && pozy2<B && a[pozx]==b[pozy2]) newdp[x][y]=(newdp[x][y]+dp[x-1][y])%mod;
                if(pozx2>=0 && pozy<A && b[pozx2]==a[pozy]) newdp[x][y]=(newdp[x][y]+dp[x][y-1])%mod;
                if(pozx2>=0 && pozy2<B && b[pozx2]==b[pozy2]) newdp[x][y]=(newdp[x][y]+dp[x][y])%mod;
            }
        }
        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;
                dp[x][y]=newdp[x][y];
                if(i==n/2) sol=(sol+dp[x][y])%mod;
            }
        }
    }
    fout<<sol<<'\n';
    return 0;
}