Cod sursa(job #2533240)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 28 ianuarie 2020 21:00:00
Problema Iv Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 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 (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;
            }
        }

    }

    for (int i = 0; i <= n; i++)
        for (int j = 0; i+j <= n; j++)
            ans=(ans+dp[n%2][i][j])%MOD;

    g << ans;

    return 0;
}