Участник:Easik/SLEXSORT

Материал из DISCOPAL
Перейти к: навигация, поиск

Примечание: вместо accepted проверочная система выдаёт четырёхзначное число и подсвечивает ячейку чёрным, но если отправить результат ещё раз, то прошлый submit будет зелёным (т.е. пройденным).

StasFomin 15:52, 17 декабря 2020 (MSK): Да, глюки системы, спасибо за пояснение.

C / gcc

#include <stdio.h>
#include <stdlib.h>
#include <string.h>  /* strlen() */
 
/* 'z' - 'a' + 1 */
#define LATIN_LETTERS 26
#define MAX_N 10000000
 
int alphabet_map[LATIN_LETTERS];
 
int compare_words(const void *word1, const void *word2);
 
 
int main() {
 
    int i;
    int t;
    long n, j;
    char alphabet[LATIN_LETTERS + 1];
 
    /* Init alphabet map */
    for (i = 0; i < LATIN_LETTERS; i++) {
 
        alphabet_map[i] = -1;
 
    }
 
    scanf("%d", &t);
    for (i = 0; i < t; i++) {
 
        if (i > 0) printf("\n");
 
        /* Read custom alphabet & set alphabet order in a map */
        scanf("%s", &alphabet);
        for (j = 0; j < (int)strlen(alphabet); j++) {
 
            alphabet_map[(int)alphabet[j] - (int)'a'] = j;
 
        }
 
        /* Read num of words and allocate memory for them */
        scanf("%ld", &n);
        char words[n][1001];
 
        for (j = 0; j < n; j++) {
 
            scanf("%s", words[j]);
 
        }
 
        // Sort words
        qsort(words, n, 1001 * sizeof(char), compare_words);
 
        // Output result
        for (j = 0; j < n; j++) {
 
            printf("%s\n", words[j]);
 
        }
 
    }
 
    return 0;
 
}
 
 
int compare_words(const void *word1, const void *word2) {
 
    const char *w1 = (const char *)word1;
    const char *w2 = (const char *)word2;
    int len1 = (int)strlen(w1);
    int len2 = (int)strlen(w2);
    int min_len = (len1 <= len2) ? len1 : len2;
    int i, idx1, idx2;
 
    for (i = 0; i < min_len; i++) {
 
        idx1 = alphabet_map[(int)w1[i] - (int)'a'];
        idx2 = alphabet_map[(int)w2[i] - (int)'a'];
 
        if (idx1 < idx2)    return -1;
        if (idx1 > idx2)    return 1;
 
    }
 
    if (len1 < len2)    return -1;
    if (len1 == len2)   return 0;
    if (len1 > len2)    return 1;
 
}