ノリでC言語で書いてみた。あらためてC++最強だとおもった。連想配列すごい。
めちゃくちゃなコード書きまくったのに大体バグらなかったのが嬉しかった(小学生並の感想)
#include "stdio.h" #include "string.h" #define min(a,b) (a<b?a:b) #define swap(a,b) (a^=b,b^=a,a^=b) int cmp(char const *a,char const *b){ int i; int len = min(strlen(a),strlen(b)); for(i=0;i<len;i++){ if(a[i] > b[i])return 1; else if(a[i] < b[i])return 0; } return strlen(a) > strlen(b); } int str_swap(char *a,char *b){ int i=0; for(i=0;i<31;i++)swap(a[i],b[i]); } int main() { int page; char tmp[31]; char table[101][31]={{0}}; int pg[101][101] = {{0}}; //ページ自体の配列 int top[101] = {0}; //それぞれのページ番号格納する変数の空き先頭 int n = 0; int i,j,k,l,m; while(~scanf("%s %d\n",tmp,&page)){ for(i=0;i<100;i++){ if(table[i][0] == '\0'){ strcpy(table[i],tmp); pg[i][top[i]++] = page; n++; break; } if(strcmp(tmp,table[i])==0){ pg[i][top[i]++] = page; break; } } } for(i=0;i<n;i++){ for(j=0;j<top[i];j++){ for(k=0;k<top[i]-1;k++){ if(pg[i][k] > pg[i][k+1]) swap(pg[i][k],pg[i][k+1]); } } } for(i=0;i<n;i++){ for(j=0;j<n-1;j++){ if(cmp(table[j],table[j+1])){ for(k=0;k<100;k++)swap(pg[j][k],pg[j+1][k]); str_swap(table[j],table[j+1]); swap(top[j],top[j+1]); } } } for(i=0;i<n;i++){ printf("%s\n",table[i]); for(j=0;j<top[i];j++) printf("%s%d",j?" ":"",pg[i][j]); puts(""); } return 0; }