Problem:
Score : 300 points

Problem Statement

You drew lottery N times. In the i-th draw, you got an item of the kind represented by a string S_i.

How many kinds of items did you get?

Constraints

1 \leq N \leq 2\times 10^5

S_i consists of lowercase English letters and has a length between 1 and 10 (inclusive).

Input

Input is given from Standard Input in the following format:

N
S_1
:
S_N

Output

Print the number of kinds of items you got.

Sample Input 1

3
apple
orange
apple

Sample Output 1

2

You got two kinds of items: apple and orange.

Sample Input 2

5
grape
grape
grape
grape
grape

Sample Output 2

1

Sample Input 3

4
aaaa
a
aaa
aa

Sample Output 3

4

Solution in C (GCC 9.2.1) (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE_TABLE 20000
struct _item
{
    char name[11];
    struct _item *next;
};

int hashFunc(char *keyStr)
{
    int sum = 0;
    int i = 0;

    while (keyStr[i] != '\0')
    {
        sum += keyStr[i];
        i++;
    }

    return sum % SIZE_TABLE;
}

int main()
{
    struct _item *roots[SIZE_TABLE];

    for (int i = 0; i < SIZE_TABLE; i++)
    {
        roots[i] = NULL;
    }

    int N;
    int count=0;

    int re_num;
    re_num=scanf("%d", &N);

    char s[11];

    re_num=scanf("%s", s);
    struct _item *item = malloc(sizeof(struct _item));
    strcpy(item->name, s);
    item->next = NULL;
    roots[hashFunc(s)] = item;
    count++;

    for (int i = 0; i < N - 1; i++)
    {
        re_num=scanf("%s", s);

        int hash_n = hashFunc(s);
        if (roots[hash_n] == NULL)
        {
            // printf("make parent\n");
            struct _item *item = malloc(sizeof(struct _item));
            strcpy(item->name, s);
            item->next = NULL;
            roots[hash_n] = item;
            count++;
        }
        else
        {
            for (struct _item *tmp = roots[hash_n]; tmp != NULL; tmp = tmp->next)
            {
                if (strcmp(tmp->name, s) == 0)
                {
                    break;
                }
                if (tmp->next == NULL)
                {
                    // printf("make child\n");
                    struct _item *item = malloc(sizeof(struct _item));
                    strcpy(item->name, s);
                    item->next = NULL;
                    tmp->next = item;
                    count++;
                    break;
                }
            }
        }
    }

    printf("%d", count);

    return 0;
}