structNode { Node* ne[26]; int cnt; } node[MAX], *root; int K;
Node* New(){ Node* ret = &node[K++]; ret->cnt = 0; for (int i = 0; i < 26; i++) { ret->ne[i] = NULL; } return ret; }
voidinit(){ K = 0; root = New(); }
voidinsert(char* s){ Node* ptr = root; char* p = s; int id; ptr->cnt++; // here we update the cnt at first when we reach it. while (*p) { id = *(p++) - 'a'; if (ptr->ne[id] == NULL) { ptr->ne[id] = New(); } ptr = ptr->ne[id]; ptr->cnt++; } }
char* find(char* s){ char* p = s; staticchar ret[30]; int top = 0; Node* ptr = root; int id; while (*p) { if (ptr->cnt == 1) { ret[top] = 0; return ret; } ret[top++] = *p; id = *(p++) - 'a'; ptr = ptr->ne[id]; } return s; }
char s[1100][30];
intmain(){ int n = 0; init(); while (gets(s[n])) { insert(s[n++]); } for (int i = 0; i < n; i++) { printf("%s %s\n", s[i], find(s[i])); } return0; }