Cod sursa(job #1507875)

Utilizator akaprosAna Kapros akapros Data 21 octombrie 2015 23:05:12
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 3210121
#define maxN 502
int n, m, dp[2][maxN][maxN], p1, p2, q1, q2, sol;
char a[maxN], b[maxN];
void read()
{
    freopen("iv.in", "r", stdin);
    gets(a + 1);
    gets(b + 1);
    n = strlen(a + 1);
    m = strlen(b + 1);
}
void add(int x, int &y)
{
    y += x;
    if (y >= mod)
         y -= mod;
}
void solve()
{
    dp[0][0][n + 1] = 1;
    for (p1 = 0; p1 <= n; ++ p1)
    {
        for (p2 = 0; p2 <= m; ++ p2)
            for (q1 = n + 1; q1 >= p1; -- q1)
        {
            q2 = m + n - q1 - p1 - p2 + 2;
            if (q2 < 0 || q2 > m + 1 || q2 < p2)
                continue;
            if (p1 + 1 < q1 - 1 && a[p1 + 1] == a[q1 - 1])
                add(dp[p1 & 1][p2][q1], dp[(p1 + 1) & 1][p2][q1 - 1]);
            if (p1 + 1 < q1 && p2 < q2 - 1 && a[p1 + 1] == b[q2 - 1])
                add(dp[p1 & 1][p2][q1], dp[(p1 + 1) & 1][p2][q1]);
            if (p1 < q1 - 1 && p2 + 1 < q2 && a[q1 - 1] == b[p2 + 1])
                add(dp[p1 & 1][p2][q1], dp[p1 & 1][p2 + 1][q1 - 1]);
            if (p2 + 1 < q2 - 1 && b[p2 + 1] == b[q2 - 1])
                add(dp[p1 & 1][p2][q1], dp[p1 & 1][p2 + 1][q1]);

            if ((p1 + 1 == q1 && p2 + 1 == q2) || ((p1 + 1 == q1 - 1 && p2 + 1 == q2) || (p2 + 1 == q2 - 1 && p1 + 1 == q1)))
                    add(dp[p1 & 1][p2][q1], sol);
        }
        memset(dp[p1 & 1], 0, sizeof(dp[p1 & 1]));
    }
}
void write()
{
    freopen("iv.out", "w", stdout);
    printf("%d", sol);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}