Cod sursa(job #3206412)

Utilizator ana_valeriaAna Valeria Duguleanu ana_valeria Data 22 februarie 2024 17:46:27
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <cstring>
#define MAX 500
#define MOD 3210121
using namespace std;
ifstream cin ("iv.in");
ofstream cout ("iv.out");
string s1, s2;
int dp[5][MAX + 1][MAX + 10];
int main()
{
    cin >> s1 >> s2;
    int n1 = s1.size();
    int n2 = s2.size();
    if (s1[0] == s1[n1 - 1])
        dp[1][1][1] = 1;
    if (s1[0] == s2[n2 - 1])
        dp[1][1][0] = 1;
    if (s2[0] == s1[n1 - 1])
        dp[1][0][1] = 1;
    if (s2[0] == s2[n2 - 1])
        dp[1][0][0] = 1;
    int n = (n1 + n2) / 2;
    for (int sz = 2; sz <= n; sz++)
        for (int i = 0; i <= n1 && i <= sz; i++)
            for (int j = 0; j <= n1 - i && j <= sz; j++)
            {
                dp[sz % 2][i][j] = 0;
                if (1 <= i && 1 <= j && s1[i - 1] == s1[n1 - j]) /// din s1 la stanga si din s1 la dreapta
                    dp[sz % 2][i][j] = (dp[sz % 2][i][j] + dp[1 - sz % 2][i - 1][j - 1]) % MOD;
                if (1 <= i && j < sz && s1[i - 1] == s2[n2 - sz + j]) /// din s1 la stanga si din s2 la dreapta
                    dp[sz % 2][i][j] = (dp[sz % 2][i][j] + dp[1 - sz % 2][i - 1][j]) % MOD;
                if (i < sz && 1 <= j && s2[sz - i - 1] == s1[n1 - j]) /// din s2 la stanga si din s1 la dreapta
                    dp[sz % 2][i][j] = (dp[sz % 2][i][j] + dp[1 - sz % 2][i][j - 1]) % MOD;
                if (i < sz && j < sz && s2[sz - i - 1] == s2[n2 - sz + j]) /// din s2 la stanga si din s2 la dreapta
                    dp[sz % 2][i][j] = (dp[sz % 2][i][j] + dp[1 - sz % 2][i][j]) % MOD;
            }
    int ans = 0;
    for (int i = 0; i <= n1; i++)
        ans = (ans + dp[n % 2][i][n1 - i]) % MOD;
    if ((n1 + n2) % 2 == 1)
        for (int i = 0; i < n1; i++)
            ans = (ans + dp[n % 2][i][n1 - i - 1]) % MOD;
    cout << ans;
    return 0;
}