Cod sursa(job #2589926)

Utilizator david.teacaDavid Stefan Teaca david.teaca Data 27 martie 2020 10:36:08
Problema Iv Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 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;
}