Cod sursa(job #1733551)

Utilizator ZenusTudor Costin Razvan Zenus Data 24 iulie 2016 22:17:21
Problema Iv Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <bits/stdc++.h>

using namespace std;

const int mod = 3210121;

string a , b;
map < pair < pair < int , int > , pair < int , int > > , int > used;

int bkt(int sa , int fa , int sb , int fb)
{
    int add = 0;
    int t = 0;

    if (used.count(make_pair(make_pair(sa , fa) , make_pair(sb , fb))))
    return used[make_pair(make_pair(sa , fa) , make_pair(sb , fb))];

    if (sa <= fa)
    {
        t = 1;

        char t = a[sa];
        bool r = 0;

        sa++;

        if (sa <= fa)
        {
            r = 1;
            if (a[fa] == t)
            {
                fa--;
                add += bkt(sa , fa , sb , fb);
                if (add >= mod) add -= mod;
                fa++;
            }
        }

        if (sb <= fb)
        {
            r = 1;
            if (b[fb] == t)
            {
                fb--;
                add += bkt(sa , fa , sb , fb);
                if (add >= mod) add -= mod;
                fb++;
            }
        }

        if (r == 0) add += 1;
        if (add >= mod) add -= mod;

        sa--;
    }

    if (sb <= fb)
    {
        t = 1;

        char t = b[sb];
        int r = 0;

        sb++;

        if (sa <= fa)
        {
            r = 1;
            if (a[fa] == t)
            {
                fa--;
                add += bkt(sa , fa , sb , fb);
                if (add >= mod) add -= mod;
                fa++;
            }
        }

        if (sb <= fb)
        {
            r = 1;
            if (b[fb] == t)
            {
                fb--;
                add += bkt(sa , fa , sb , fb);
                if (add >= mod) add -= mod;
                fb++;
            }
        }

        if (r == 0) add += 1;
        if (add >= mod) add -= mod;

        sb--;
    }

    if (t == 0) add += 1;
    if (add >= mod) add -= mod;

    used[make_pair(make_pair(sa , fa) , make_pair(sb , fb))] = add;

    return add;
}

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

fin >> a;
fin >> b;

fout << bkt(0 , a.size() - 1 , 0 , b.size() - 1) << '\n';

return 0;
}