Cod sursa(job #3171489)

Utilizator gabriel.9619Gabriel Stefan Tita gabriel.9619 Data 18 noiembrie 2023 22:59:09
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <cstring>
#define mod 3210121
#define dim 502
using namespace std;
ifstream fin("iv.in");
ofstream fout("iv.out");
int d[2][dim][dim];
char s[dim], t[dim];
int main()
{
    bool ok;
    int n, m, sol=0, i, j, k;
    fin.getline(s+1, dim);
    fin.getline(t+1, dim);
    n=strlen(s+1);
    m=strlen(t+1);
    if(s[1]==s[n])
    {
        d[1][1][1]=1;
    }
    if(s[1]==t[m])
    {
        d[1][1][0]=1;
    }
    if(t[1]==t[m])
    {
        d[1][0][0]=1;
    }
    if(t[1]==s[n])
    {
        d[1][0][1]=1;
    }
    ok=1;
    for(k=2;k<=(n+m)/2;k++)
    {
        ok=1-ok;
        for(i=0;i<=n&&i<=k;i++)
        {
            for(j=0;i+j<=n&&j<=k;j++)
            {
                d[ok][i][j]=0;
                if(s[i]==s[n-j+1]&&i>=1&&n-j+1<=n)
                {
                    d[ok][i][j]+=d[1-ok][i-1][j-1];
                }
                if(s[i]==t[m-k+j+1]&&i>=1&&m-k+j+1<=m)
                {
                    d[ok][i][j]+=d[1-ok][i-1][j];
                }
                if(t[k-i]==s[n-j+1]&&k-i>=1&&n-j+1<=n)
                {
                    d[ok][i][j]+=d[1-ok][i][j-1];
                }
                if(t[k-i]==t[m-k+j+1]&&k-i>=1&&m-k+j+1<=m)
                {
                    d[ok][i][j]+=d[1-ok][i][j];
                }
                d[ok][i][j]%=mod;
            }
        }
    }
    if((n+m)%2==0)
    {
        for(int i=0;i<=n;i++)
        {
            sol+=d[ok][i][n-i];
            sol%=mod;
        }
    }
    else
    {
        for(i=0;i<=n;i++)
        {
            sol+=d[ok][i][n-i]+d[ok][i][n-i-1];
            sol%=mod;
        }
    }
    fout<<sol;
    return 0;
}