1002 bad one - Time Limit Exceeded

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/* It is not used.
 *
char dict[8][3] = {
        {'A', 'B', 'C'},
        {'D', 'E', 'F'},
        {'G', 'H', 'I'},
        {'J', 'K', 'L'},
        {'M', 'N', 'O'},
        {'P', 'R', 'S'},
        {'T', 'U', 'V'},
        {'W', 'X', 'Y'}
};
*/


/* Return:
 * 0: for str1 is before str2.
 * 1: for str2 is before str1.
 */
int compare_sort(char *str1, char *str2)
{
        int i;

        for (i = 0;i < 9;++i) {
                if (str1[i] < str2[i])
                        return 0;
                else if (str2[i] < str1[i])
                        return 1;
                else if (str1[i] == str2[i])
                        continue;
        }

        /* should not go into this subroutine. */
        return -1;
}

/* Return:
 * 0: for str1 is equal to str2.
 * non-0: for not equal.
 */
int compare(char *str1, char *str2)
{
        int i;

        for (i = 0;i < 9;++i) {
                if (str1[i] != str2[i])
                        return 1;
        }

        return 0;
}

/* It is stupid way. ^_^ */
char myitoa(int i)
{
        switch(i) {
        case 1:
                return '1';
        case 2:
                return '2';
        case 3:
                return '3';
        case 4:
                return '4';
        case 5:
                return '5';
        case 6:
                return '6';
        case 7:
                return '7';
        case 8:
                return '8';
        case 9:
                return '9';
        case 0:
                return '0';
        default:
                return '0';
        }
}

/* A two dimension array for storing standard form phone number,
 * Also used for counting duplicates. For instance,
 * (Note, the first one is a pointer to phone number, the second
 *  one is the duplicate times.
 *
 * {&"333-5555", 3},
 * {&"444-6666", 4},
 * etc...
 */
char ***phone = NULL;

void format_to_standard(char *phone_number, int count)
{
        int len = 0, i;
        char *number = NULL;
        int cnt_of_digit = 0;

        len = strlen(phone_number);
        if (len < 7)
                return;

        number = (char*)malloc(9 * sizeof(char));
        if (number == NULL)
                exit(-2);

        for (i = 0;i < len;++i) {
                if (phone_number[i] == '-')
                        continue;

                /* Digit validation check.
                 * It cannot be Q or Z.
                 * And it must be 1~9 or A~Y.
                 */
                if (phone_number[i] < '0' || (phone_number[i] > '9' && phone_number[i] < 'A')
                        || phone_number[i] >= 'Z' || phone_number[i] =='Q')
                        break;

                /* If it is a number. */
                if (phone_number[i] < 'A') {
                        number[cnt_of_digit++] = phone_number[i];
                } else {
                /* It must be a upper character */
                        if (phone_number[i] < 'Q') {
                                number[cnt_of_digit++] = myitoa((phone_number[i] - 'A') / 3 + 2);
                        } else if (phone_number[i] == 'R' || phone_number[i] == 'S') {
                                number[cnt_of_digit++] = '7';
                        } else if (phone_number[i] == 'U' || phone_number[i] == 'V' || phone_number[i] == 'T') {
                                number[cnt_of_digit++] = '8';
                        } else if (phone_number[i] == 'W' || phone_number[i] == 'X' || phone_number[i] == 'Y') {
                                number[cnt_of_digit++] = '9';
                        }
                }

                if (cnt_of_digit == 3) {
                        number[cnt_of_digit++] = '-';
                }
        }
        number[cnt_of_digit] = '\0';

        /* Assign mem of storing phone number to Array */
        phone[count][0] = number;
        phone[count][1] = (char*)1;

        return;
}

void count_duplicate(int count)
{
        int flag_loop = 0;              /* This flag is used in i-loop for determining if dup exists. */
        int flag_all = 0;               /* This flag is used for indicating duplicate, and whether need to print */
        int *index_dup = NULL;
        int i, j, ret = -1;
        int cnt_dup = 0;
        int tmp;

        index_dup = (int*)malloc(count * sizeof(int));
        if (index_dup == NULL)
                exit(-2);

        for (i = 0;i < count;++i) {
                if ((int)phone[i][1] == -1)
                        continue;
                for (j = i + 1;j < count;++j) {
                        ret = compare(phone[i][0],phone[j][0]);
                        if (ret == 0) {
                                phone[i][1]++;
                                phone[j][1] = (char*)-1;
                                flag_loop = 1;
                        }
                }
                if (flag_loop == 1) {
                        index_dup[cnt_dup++] = i;
                        flag_all = 1;
                }

                flag_loop = 0;
        }

        if (flag_all == 0) {
                printf("No duplicates.\n");
        } else {
                for (i = 0;i < cnt_dup;++i) {
                        for (j = i + 1;j < cnt_dup;++j) {
                                ret = compare_sort(phone[index_dup[i]][0],phone[index_dup[j]][0]);
                                if (ret == 1) {
                                        tmp = index_dup[i];
                                        index_dup[i] = index_dup[j];
                                        index_dup[j] = tmp;
                                }
                        }
                }

                /* This is used for printing phone number in ascending order. */
                for (i = 0;i < cnt_dup;++i) {
                        printf("%s %d\n",phone[index_dup[i]][0],(int)phone[index_dup[i]][1]);
                }
        }
}

void free_mem(int len)
{
        int i;

        for (i = 0;i < len;++i) {
                if (phone[i][0] != NULL) {
                        free(phone[i][0]);
                        phone[i][0] = NULL;
                }
                free(phone[i]);
                phone[i] = NULL;
        }
}

int main(void)
{
        char number[10];
        char phone_number[16];
        int count = 0, i;

        scanf("%s", number);
        count = atoi(number);
        if (count <= 0 || count > 100000)
                exit(-1);

        phone = (char***)malloc(count * sizeof(char**));
        if (phone == NULL)
                exit(-2);

        /* Malloc the array of char pointer, and initialize */
        for (i = 0;i < count;++i) {
                phone[i] = (char**)malloc(2 * sizeof(char*));
                if (phone[i] == NULL)
                        exit(-2);

                phone[i][0] = NULL;
                phone[i][1] = NULL;
        }

        for (i = 0;i < count;++i) {
                scanf("%s", phone_number);
                format_to_standard(phone_number,i);
        }

        count_duplicate(count);

        free_mem(count);

        return 0;
}


你可能感兴趣的:(limit)