1002 bad one - Time Limit Exceeded
9039 단어 limit
#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.
");
} 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
",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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
노드js-API분류유한공사이 조직의 분류 시스템에 한계가 있어서, 관문을 지키는 사람이 이 조직에 들어오는 수량을 통제할 수 있다.디카모스시 수입식물분류유한공사, 분당 100개.뉴메로의 요구를 초과한 변호사로서, 그는 변호사에게 특별한 리듬...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.