Cod sursa(job #1402263)

Utilizator retrogradLucian Bicsi retrograd Data 26 martie 2015 13:56:16
Problema Culori Scor 16
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<fstream>
#include<vector>

using namespace std;
typedef int var;

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

#define MAXN 280
#define P 9901

vector<var> POZ[MAXN];
var V[2*MAXN];
var DIN[2*MAXN][2*MAXN];

var lower(vector<var> &V, var val) {
    var i, poz=0;
    for(i=1; i<V.size(); i<<=1);
    for(i>>=1;i;i>>=1) {
        if(poz+i<V.size() && V[poz+i] <= val)
            poz += i;
    }
    return poz;
}

int main() {

    var n;
    fin>>n;
    for(var i=1; i<=n; i++) {
        POZ[i].push_back(0);
    }

    for(var i=1; i<=2*n-1; i++) {
        fin>>V[i];
        POZ[V[i]].push_back(i);
    }

    for(var len=1; len<=2*n-1; len+=2) {
        for(var b=1; b+len-1<=2*n-1; b++) {
            var e = b+len-1;
            //fout<<b<<" "<<e<<" : ";
            if(b == e) DIN[b][e] = 1;
            else if(V[b] != V[e]) DIN[b][e] = 0;
            else {
                //DIN[b][e] += DIN[b+1][e-1];
                //DIN[b][e] %= P;

                var p1 = lower(POZ[V[b]], b),
                    p2 = lower(POZ[V[b]], e);
                //fout<<POZ[V[b]][p1]<<" "<<POZ[V[b]][p2];
                if(p1 <= p2) {
                    var delta = p2-p1;

                    for(var i=(1<<delta)+1; i<(1<<(delta+1)); i+=2) {
                        var last = POZ[V[b]][p1];
                        var rez = 1;

                        for(var bit=1; bit<=delta; bit++) {
                            if(i & (1<<bit)) {
                                var p = POZ[V[b]][p1+bit];
                                rez *= DIN[last+1][p-1];
                                rez %= P;
                                last = p;
                            }
                        }
                        DIN[b][e] += rez;
                        DIN[b][e] %= P;
                    }
                }

            }
            //fout<<endl;
        }
    }

    fout<<DIN[1][2*n-1];

    return 0;
}