Cod sursa(job #1050759)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 9 decembrie 2013 07:46:57
Problema Iv Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 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,ans=0;
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 >= 1; --k)
    {
        for (int i=0; i<=na; ++i)
        {

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



                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;
                }

                if (s1 == l1-1 && s2 == l2-1) ans += dp[ok][s1][s2];
            }
        }

        ok = 1 - ok;
    }

    fout<<ans;
}