Cod sursa(job #1423912)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 22 aprilie 2015 23:33:42
Problema Elementul majoritar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>

#define MAX_N 1000000
#define BITS 8
#define MASK ((1 << BITS) - 1)

int v[MAX_N];
int count[4][MASK];

int main(void) {
  FILE *f;
  int n;

  f = fopen("elmaj.in", "r");
  fscanf(f, "%d", &n);
  for (int i = 0; i < n; i++) {
    fscanf(f, "%d", &v[i]);
    count[0][v[i] & MASK]++;
    count[1][(v[i] >> 8) & MASK]++;
    count[2][(v[i] >> 16) & MASK]++;
    count[3][(v[i] >> 24) & MASK]++;
  }
  fclose(f);

  int maj = (n >> 1) + 1;
  int candidate = 0;
  int i = 3;
  while ((i >= 0) && (candidate != -1)) {
    int j = 0;
    while ((j < (1 << BITS)) && (count[i][j] < maj)) {
      j++;
    }
    if (j == (1 << BITS)) {
      candidate = -1;
    } else {
      candidate = (candidate << 8) | j;
    }
    i--;
  }

  int cnt = 0;
  for (i = 0; i < n; i++) {
    cnt += (v[i] == candidate);
  }
  f = fopen("elmaj.out", "w");
  if (cnt >= maj) {
    fprintf(f, "%d %d\n", candidate, cnt);
  } else {
    fputs("-1\n", f);
  }
  fclose(f);
  return 0;
}