Cod sursa(job #1074258)

Utilizator impulseBagu Alexandru impulse Data 7 ianuarie 2014 13:40:15
Problema Elementul majoritar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2 kb
//
//  main.c
//  elmaj
//
//  Created by Alexandru Bâgu on 1/7/14.
//  Copyright (c) 2014 Alexandru Bâgu. All rights reserved.
//

#include <stdio.h>

#define HASH_KEY 131072

struct hashPoint{
    int value;
    int count;
    struct hashPoint *next;
};

#define node struct hashPoint

int add(node* nodes, int x)
{
    node *_node = &nodes[x % HASH_KEY];
    while(_node != NULL)
    {
        if(_node->next == NULL)
        {
            _node->value = x;
            _node->count = 1;
            _node->next = malloc(sizeof(node));
            _node->next->next = NULL;
            return 1;
        }
        else
        {
            if(_node->value == x) {
                _node->count++;
                return _node->count;
            }
            else _node = _node->next;
        }
    }
    return 1;
}
int rem(node* nodes, int x)
{
    node *_node = &nodes[x % HASH_KEY];
    node * next = _node->next;
    
    while(_node != NULL)
    {
        if(_node->next == NULL)
            return 0;
        else if(_node->value == x)
        {
            _node->value = _node->next->value;
            _node->next = _node->next->next;
            return 1;
        }
        else _node = _node->next;
    }
    return 0;
    
}
int contains(node* nodes, int x)
{
    node *_node = &nodes[x % HASH_KEY];
    while(_node != NULL)
    {
        if(_node->next == NULL)
        {
            return 0;
        }
        else
        {
            if(_node->value == x) return 1;
            else _node = _node->next;
        }
    }
    return 0;
}

int main(int argc, const char * argv[])
{
    FILE* fin = fopen("elmaj.in", "r"),
    * fout = fopen("elmaj.out", "w");
    
    node *hash = malloc(sizeof(node) * HASH_KEY);
    int n, i, q;
    int mq = -1, mc = 0;
    fscanf(fin, "%d", &n);
    for(i = 0; i < n; i++)
    {
        fscanf(fin, "%d", &q);
        int count = add(hash, q);
        if(count > mc)
        {
            mc = count;
            mq = q;
        }
    }
    fprintf(fout, "%d %d", mq, mc);
    return 0;
}