Cod sursa(job #2533260)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 28 ianuarie 2020 21:08:22
Problema Iv Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define MOD 3210121
#define Nmax 105

using namespace std;

ifstream f("iv.in");
ofstream g("iv.out");

char a[Nmax], b[Nmax];
int dp[3][Nmax][Nmax]; // inca, sfa, incb
int ans=0;

int mod(int x)
{
    if(x >= MOD) x -= MOD;

    return x;
}

void add(int &a, int b)
{
    a+=b;
    a=mod(a);
}

int main()
{
    f >> a+1 >> b+1;
    int n=strlen(a+1), m=strlen(b+1);

    dp[0][0][0]=1;

    for (int i = 0; i <= n; i++)
    {
        for (int j = 0; j+i <= n; j++)
        {
            for (int k = 0; k <= m; k++)
            {
                int l=i+k-j;

                if (l < 0 || k+l > m) continue;

                if (l+i+j+k == n+m || l+i+j+k == m+n-1)
                {
                    add(ans, dp[i%2][j][k]);
                    continue;
                }

                if (a[i+1] == a[n-j]) add(dp[(i+1)%2][j+1][k], dp[i%2][j][k]);

                if (a[i+1]==b[m-l]) add(dp[(i+1)%2][j][k], dp[i%2][j][k]);

                if (b[k+1]==a[n-j]) add(dp[i%2][j+1][k+1], dp[i%2][j][k]);

                if (b[k+1]==b[m-l]) add(dp[i%2][j][k+1], dp[i%2][j][k]);

                dp[i%2][j][k]=0;
            }
        }

    }

    g << ans;

    return 0;
}