Cod sursa(job #1902100)

Utilizator Burbon13Burbon13 Burbon13 Data 4 martie 2017 13:33:05
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int nmx = 502;
const int mod = 3210121;

char s1[nmx],s2[nmx];
int dp[2][nmx][nmx];
int rez;

int main()
{
    freopen("iv.in", "r", stdin);
    freopen("iv.out", "w", stdout);

    scanf("%s", s1+1);
    scanf("%s", s2+1);

    int l1 = strlen(s1+1), l2 = strlen(s2+1);
    bool pos = 1;

    dp[0][0][l1+1] = 1;

    for(int st1 = 0; st1 <= l1 + 1; ++st1)
    {
        pos ^= 1;
        for(int st2 = 0; st2 <= l2; ++st2)
            for(int dr1 = l1 + 1; dr1 >= st1; --dr1)
            {
                int dr2 = l1 + l2 + 2 - st1 - st2 - dr1;

                if(st1 + 1 < dr1 - 1 && s1[st1+1] == s1[dr1-1])
                    dp[pos^1][st2][dr1-1] = (dp[pos^1][st2][dr1-1] + dp[pos][st2][dr1]) % mod;
                if(st1 + 1 < dr1 && st2 < dr2 - 1 && s1[st1+1] == s2[dr2-1])
                    dp[pos^1][st2][dr1] = (dp[pos^1][st2][dr1] + dp[pos][st2][dr1]) % mod;
                if(st1 < dr1 - 1 && st2 + 1 < dr2 && s1[dr1-1] == s2[st2+1])
                    dp[pos][st2+1][dr1-1] = (dp[pos][st2+1][dr1-1] + dp[pos][st2][dr1]) % mod;
                if(st2 + 1 < dr2 - 1 && s2[st2+1] == s2[dr2-1])
                    dp[pos][st2+1][dr1] = (dp[pos][st2+1][dr1] + dp[pos][st2][dr1]) % mod;

                int df1 = dr1 - st1, df2 = dr2 - st2;

                if((df1 == 1 && df2 == 1) || (df1 == 2 && df2 == 1) || (df1 == 1 && df2 == 2))
                    rez = (rez + dp[pos][st2][dr1]) % mod;
            }
        memset(dp[pos], 0, sizeof(dp[pos]));
    }

    printf("%d\n", rez);

    return 0;
}