Cod sursa(job #595081)

Utilizator SpiderManSimoiu Robert SpiderMan Data 11 iunie 2011 08:36:35
Problema Expresii 2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <stdio.h>
#include <algorithm>
#include <string>
#include <map>
#include <fstream>
#include <cstring>
using namespace std;

#define MAX_N 32
#define FIN "expresii2.in"
#define FOUT "expresii2.out"
#define ll long long

ofstream f("try22.in") ;
int N, K; char S[MAX_N], ch[MAX_N]; ll P;
map<string, ll> mem[MAX_N];

inline bool check (string S, int N, char ch) {
    return (S.size() < N || (S.size() == N && S[N - 1] == ch));
}
string sub (string p, int st, int dr) {
f << "p = " << p << " st = " << st << " dr = " << dr << " rez = " << p.substr(st, dr) << " " << "strlen " << p.substr(st,dr).size() << "\n";
    return p.substr(st, dr);
}
ll solve(int n, string p)
{
    int i, ok;
    ll ret = 0;
f << n << "\n";
    if (n == 1)
        return !p.size() ? K : p[0]  >= 'A' && p[0] <= 'Z' ? 1 : 0;
    if (mem[n].count(p) > 0) return mem[n][p];
    if (p.size() < n || (p.size() == n && p[n-1] == '!'))
        ret = solve(n-1, sub(p,0, n-1));
    ok =  check (p, n, '+') + check (p, n, '*');
    for (i = 1; i+1 < n; i++) {
        f << n << " " << i << " " << n - i - 1 << " " << p.size () << "\n" ;
        //printf ("%d %d\n", i, N - i - 1) ;
        ret += ok*solve(i, sub(p,0, i))*solve(n-i-1, p.size() < i ? "" : sub(p,i, n-i-1));
    }
    mem[n][p] = ret;
    return ret;
}

int main(void)
{
    int i, j;
    ll ret = 0;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d %lld", &N, &K, &P);

    printf("%lld\n", solve(N, ""));
    f << "STOP\n" ;
    for (i = 0; i < K; i++) ch[i] = 'A'+i;
    ch[K] = '+'; ch[K+1] = '*'; ch[K+2] = '!';
    for (i = 0; i < N; i++)
        for (j = 0; j < K+3; j++)
        {f << S << " " ;
            S[i] = ch[j];
            ll x = solve (N, S) ;

            ret += x; f << "TE\n" ;
            if (P <= ret) { ret -= x; break; }
        }
    printf("%s\n", S);

    return 0;
}