http://acm.pku.edu.cn/JudgeOnline/problem?id=1002

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>

#define MAX_LIST 100000

char *str = "ABCDEFGHIJKLMNOPRSTUVWXY";
int list[MAX_LIST];
int map[256];

void read_number(int index)
{
  int c, sum = 0;

  while ((c = getchar()) != EOF && c != '\n') {
    assert(isupper(c) || isdigit(c) || c == '-');
    if (c != '-') {
      assert(map[c] >= 0);
      sum = sum * 10 + map[c];
    }
  }
  assert(0 <= sum && sum <= 9999999);
  list[index] = sum;
}

void print_duplicate(int n)
{
  int i, j, no = 1;

  for (i = 0; i < n; ) {
    for (j = i+1; j < n && list[i] == list[j]; j++)
      ;
    if (j-i > 1) {
      printf("%03d-%04d %d\n", list[i] / 10000, list[i] % 10000, j-i);
      no = 0;
    }
    i = j;
  }
  if (no) {
    printf("No duplicates.\n");
  }
}

int cmp(const void *a, const void *b)
{
  int *x = (int *)a;
  int *y = (int *)b;
  return *x - *y;
}

int main()
{
  int i, j, n, t;

  for (i = 0; i < 256; i++) {
    map[i] = -1;
  }
  j = 0;
  for (i = 2; i <= 9; i++) {
    map[str[j++]] = i;
    map[str[j++]] = i;
    map[str[j++]] = i;
  }
  for (i = '0'; i <= '9'; i++) {
    map[i] = i - '0';
  }
  
  t = scanf("%d\n", &n);
  assert(t == 1 && 0 < n && n <= MAX_LIST);

  for (i = 0; i < n; i++) {
    read_number(i);
  }

  qsort(list, n, sizeof(int), cmp);
  print_duplicate(n);

  return 0;
}