Cod sursa(job #1050666)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 8 decembrie 2013 22:16:50
Problema Iv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#include <string.h>

#define maxn 510
#define mod 3210121

using namespace std;

ifstream fin("iv.in");
ofstream fout("iv.out");

int dp[2][maxn][maxn],ok;
char a[maxn],b[maxn];

int main()
{
    fin>>(a+1)>>(b+1);

    int na = strlen(a+1);
    int nb = strlen(b+1);

    dp[0][0][0] = 1;

    ok=0;

    for (int k=na+1; k > na/2; --k)
    {
        for (int i=0; i<=na/2; ++i)
        {

            for (int j=0; j<=nb/2; ++j)
            {
                int s1 = i;
                int s2 = j;
                int l1 = k;
                int l2 = nb - (s1+s2-na-2+l1);

                if (l2 <= nb/2 || l2 >nb+1)
                {
                    continue;
                }

                if (ok != 0 && s1!=0 && s2!=0)
                dp[ok][s1][s2] = 0;

                if (s1 > 0 && a[s1] == a[l1])
                {
                    dp[ok][s1][s2] += dp[1-ok][s1-1][s2];
                }

                if (s1 > 0 && a[s1] == b[l2])
                {
                    dp[ok][s1][s2] += dp[ok][s1-1][s2];
                    if (dp[ok][s1][s2] >= mod) dp[ok][s1][s2] -= mod;
                }

                if (s2 > 0 && b[s2] == a[l1])
                {
                    dp[ok][s1][s2] += dp[1-ok][s1][s2-1];
                    if (dp[ok][s1][s2] >= mod) dp[ok][s1][s2] -= mod;
                }

                if (s2 > 0 && b[s2] == b[l2])
                {
                    dp[ok][s1][s2] += dp[ok][s1][s2-1];
                    if (dp[ok][s1][s2] >= mod) dp[ok][s1][s2] -= mod;
                }
            }
        }

        ok = 1 - ok;
    }

    ok = 1 - ok;

    fout<<(dp[ok][na/2][na/2]*2)%mod;
}