Cod sursa(job #40526)

Utilizator DastasIonescu Vlad Dastas Data 27 martie 2007 14:45:02
Problema Triplete Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include <iostream>

using namespace std;

FILE *in = fopen("triplete.in", "r"), *out = fopen("triplete.out", "w");

int n, m;

void rezbiti()
{
    fscanf(in, "%d %d", &n, &m);
    unsigned int **a = new unsigned int*[4096];
    for ( int i = 0; i < 4096; ++i )
        a[i] = new unsigned int[128], memset(a[i], 0, 128);

    struct perechi
    {
        unsigned int a, b;
    };

    perechi *b = new perechi[65537];
    for ( int i = 0; i < m; ++i )
    {
        //in >> b[i].a >> b[i].b;
        fscanf(in, "%d %d", &b[i].a, &b[i].b);
        b[i].a -= 1;
        b[i].b -= 1;
        a[b[i].a][b[i].b/32] |= (1<<(b[i].b%32));
        a[b[i].b][b[i].a/32] |= (1<<(b[i].a%32));
    }

    unsigned int cnt = 0;
    int s = n/32+1;
    for ( int i = 0; i != m; ++i )
    {
        for ( int j = 0; j != s; ++j )
        {
            unsigned int t = a[b[i].a][j] & a[b[i].b][j];
            //for ( int biti = 0; biti != 32; ++biti )
              //  cnt += (t & (1<<biti)) != 0;
            while ( t )
            {
                ++cnt;
                t &= t-1;
            }
        }
    }

    fprintf(out, "%u\n", cnt/3);
}

int main()
{
    //read();
    //printmat();
    rezbiti();

	return 0;
}