Cod sursa(job #1039454)

Utilizator maritimCristian Lambru maritim Data 23 noiembrie 2013 02:47:39
Problema Dtcsu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<cstdio>
#include<cstdlib>
#include<ctype.h>
#include<iostream>
#include<unordered_set>
#include<set>
using namespace std;

FILE *f = fopen("dtcsu.in","r");
FILE *g = fopen("dtcsu.out","w");

#define MaxS 100
#define M 276997
#define ll long long
#define MaxDoi 100

int T,Sol;
ll x;
char S[MaxS];
ll Doi[MaxDoi];
int echiv[MaxDoi];
unordered_set<ll> Q;

inline ll getInt(void)
{
    ll nr = 0;

    for(int i=0;isdigit(S[i]);nr = nr * 10 + S[i++]-'0');

    return nr;
}


void citire(void)
{
    ll x;

    for(int i=1;i<=M;i++)
    {
        fgets(S,sizeof(S),f);
        x = getInt();
        if(x&1)
            Q.insert(x);
    }
}

void preprocesare(void)
{
    Doi[1] = (1<<1)-1;
    Doi[2] = (1<<2)-1;
    Doi[3] = (1<<4)-1;
    Doi[4] = (1<<8)-1;
    Doi[5] = (1<<16)-1;
    Doi[6] = (1LL<<32)-1;
    echiv[1] = 1; echiv[2] = 2; echiv[3] = 4;
    echiv[4] = 8; echiv[5] = 16; echiv[6] = 32;

    //for(int i=1;i<=6;i++)
    //    cout << Doi[i] << "\n";
}

inline int exist(ll val)
{
    for(int i=6;i;i--)
        if((val&Doi[i]) == 0)
            val >>= echiv[i];
    //for(;(val&1) == 0;val >>= 1);

    //cout << val << "\n";
    if(Q.find(val) != Q.end())
        return 1;
    return 0;
}

int main()
{
    citire();
    preprocesare();
    fscanf(f,"%d\n",&T);
    for(int i=1;i<=T;i++)
    {
        fgets(S,sizeof(S),f);
        x = getInt();

        Sol += exist(x);
    }

    fprintf(g,"%d\n",Sol);
}