Test Message

d634: 魔法卡magic

內容

繼梅蘭城的法師們在你的幫助下,成功節約符咒之後,
他們順利大量生產了各式魔法的符咒,但是…

符咒太多了所以把符咒室弄得亂七八糟的-▽-

所以請你寫一個程式再度幫助他們把符咒整理好吧。


輸入

每個測資點僅一組測資,不必 EOF 讀檔。
第一行有整數 n(1<n<=100000)表示接下來有 n 張符咒
從第二行開始的 n 行
每行有一個符咒的名稱,內容可能包含小寫字母、大寫字母、數字、空格字元。
並且每行不超過 10 個字元

7
penguin
jacker
jack doom
JACK
ws23
aszx87140
e196819

輸出

請依照”檔案系統”的方法,將這 n 個符咒排序後的結果輸出。
所謂檔案系統排序就是,
對於兩個英文單字的比較以 abc 和 xyz 來說,
先從第一個字母的”ASCII”值開始比,
(以這題出現的 ASCII 來說,空格<數字<大寫字母(AZ)<小寫字母(az))
如 a<x,所以 abc 在 xyz 前面。
如果第一個字母相同,則比較下一個字母,如 abx 對上 aby,
比到第三位 x<y,所以 abx 在 aby 前面。

JACK
aszx87140
e196819
jack doom
jacker
penguin
ws23


解題思路

簡單的字串排序,除了存字串用的陣列,再開一個指標陣列去映射原陣列,這樣只要排序指標陣列並輸出就可以大幅減少記憶體操作的次數。


完整程式碼

AC (53ms, 2.7MB)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char list[100000][11], * sort[100000];

int cmp(const char** lhs, const char** rhs)
{
return strcmp(*lhs, *rhs);
}

int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
sort[i] = list[i];
getchar();
for (int i = 0; i < n; i++)
gets(list[i]);
qsort(sort, n, sizeof(char**), cmp);
for (int i = 0; i < n; i++)
puts(sort[i]);
return 0;
}