Cod sursa(job #3170336)

Utilizator biancalautaruBianca Lautaru biancalautaru Data 17 noiembrie 2023 14:10:19
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#include <cstring>
#define MOD 3210121
#define DIM 505
using namespace std;
ifstream fin("iv.in");
ofstream fout("iv.out");
int n,m,sol,d[2][DIM][DIM];
char s[DIM],t[DIM];
bool ok;
int main() {
    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 (int k=2;k<=(n+m)/2;k++) {
        ok=1-ok;
        for (int i=0;i<=n && i<=k;i++)
            for (int 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 (int i=0;i<=n;i++) {
            sol+=d[ok][i][n-i]+d[ok][i][n-i-1];
            sol%=MOD;
        }
    fout<<sol;
    return 0;
}