#include #include #include #include static void *root; static int cmp(const void *a, const void *b) { return strcmp(a, b); } static char *sdup(char *s) { size_t n = strlen(s)+1; return memcpy(malloc(n), s, n); } static int add(char *s) { char **r = tsearch(s, &root, cmp); if (*r == s) { /* only do the string copy if s is a new string */ *r = sdup(s); return 1; } return 0; } static int getword(char *s) { int c; for (;;) { c = getchar(); if (c == EOF) return 0; if (!(c == ' ' || c == '\n' || c == '\r' || c == '\t')) break; } for (;;) { *s++ = c; c = getchar(); if (c == EOF || c == ' ' || c == '\n' || c == '\r' || c == '\t') break; } *s = 0; return 1; } int main(void) { char buf[4096]; int c = 0; while (getword(buf)) c += add(buf); printf("%d\n", c); return 0; }