#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char *s;
struct node *next;
struct node *lesser, *greater;
};
static void print(const struct node *np)
{
if (!np)
return;
print(np->lesser);
for (const struct node *ptr = np; ptr; ptr = ptr->next)
print(np->greater);
}
static struct node *install(struct node **tree, struct node *np)
{
int t;
np->greater = np->lesser = 0;
while (*tree) {
if (!(t
= strcmp(np
->s
, (*tree
)->s
))) return *tree;
tree = t < 0 ? &(*tree)->lesser : &(*tree)->greater;
}
*tree = np;
return 0;
}
static struct node *new(const char *s)
{
struct node *np;
np->next = 0;
return np;
}
int main(void)
{
struct node *tree = 0, *np, *nt;
char buf[8192];
while (fgets(buf
, sizeof buf
, stdin
)) if ((np = install(&tree, nt = new(buf)))) {
nt->next = np->next; // Handle collision
np->next = nt;
}
print(tree);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKc3RydWN0IG5vZGUgewoJY2hhciAqczsKCXN0cnVjdCBub2RlICpuZXh0OwoJc3RydWN0IG5vZGUgKmxlc3NlciwgKmdyZWF0ZXI7Cn07CgpzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3Qgbm9kZSAqbnApCnsKCWlmICghbnApCgkJcmV0dXJuOwoJcHJpbnQobnAtPmxlc3Nlcik7Cglmb3IgKGNvbnN0IHN0cnVjdCBub2RlICpwdHIgPSBucDsgcHRyOyBwdHIgPSBwdHItPm5leHQpCgkJZnB1dHMocHRyLT5zLCBzdGRvdXQpOwoJcHJpbnQobnAtPmdyZWF0ZXIpOwp9CgpzdGF0aWMgc3RydWN0IG5vZGUgKmluc3RhbGwoc3RydWN0IG5vZGUgKip0cmVlLCBzdHJ1Y3Qgbm9kZSAqbnApCnsKCWludCB0OwoKCW5wLT5ncmVhdGVyID0gbnAtPmxlc3NlciA9IDA7Cgl3aGlsZSAoKnRyZWUpIHsKCQlpZiAoISh0ID0gc3RyY21wKG5wLT5zLCAoKnRyZWUpLT5zKSkpCgkJCXJldHVybiAqdHJlZTsKCQl0cmVlID0gdCA8IDAgPyAmKCp0cmVlKS0+bGVzc2VyIDogJigqdHJlZSktPmdyZWF0ZXI7Cgl9CgkqdHJlZSA9IG5wOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqbmV3KGNvbnN0IGNoYXIgKnMpCnsKCXN0cnVjdCBub2RlICpucDsKCglpZiAoIShucCA9IG1hbGxvYyhzaXplb2YgKm5wKSkgfHwgIShucC0+cyA9IG1hbGxvYyhzdHJsZW4ocykgKyAxKSkpCgkJZXhpdChFWElUX0ZBSUxVUkUpOwoJc3RyY3B5KG5wLT5zLCBzKTsKCW5wLT5uZXh0ID0gMDsKCXJldHVybiBucDsKfQoKaW50IG1haW4odm9pZCkKewoJc3RydWN0IG5vZGUgKnRyZWUgPSAwLCAqbnAsICpudDsKCWNoYXIgYnVmWzgxOTJdOwoKCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZiBidWYsIHN0ZGluKSkKCQlpZiAoKG5wID0gaW5zdGFsbCgmdHJlZSwgbnQgPSBuZXcoYnVmKSkpKSB7CgkJCW50LT5uZXh0ID0gbnAtPm5leHQ7CS8vIEhhbmRsZSBjb2xsaXNpb24KCQkJbnAtPm5leHQgPSBudDsKCQl9CglwcmludCh0cmVlKTsKCXJldHVybiAwOwp9