#include <bits/stdc++.h>
using namespace std;
struct NumberTheory {
  static const long long mod = 1e9 + 7;
  vector<long long> factorial = {1}, factorialInv = {1};
  inline long long mult(long long a, long long b, long long m = mod) {
    return (a * b) % m;
  }
  inline long long norm(long long x) {
    x %= mod;
    if (x < 0) x += mod;
    return x;
  }
  inline long long div(long long a, long long b) { return mult(a, inv(b)); }
  inline long long sub(long long a, long long b) { return norm(a - b); }
  inline long long add(long long a, long long b) { return (a + b) % mod; }
  long long ncr(long long n, long long r) {
    assert(n >= 0);
    if (r < 0 || n < r) return 0;
    return mult(fac(n), mult(finv(r), finv(n - r)));
  }
  long long npr(long long n, long long r) {
    assert(n >= 0);
    if (r < 0 || n < r) return 0;
    return mult(fac(n), finv(n - r));
  }
  long long finv(long long n) {
    long long last = factorialInv.size() - 1;
    if (last < n) {
      vector<long long> finv_temp(n - last);
      finv_temp[0] = inv(fac(n));
      for (long long i = 1; i < (long long)finv_temp.size(); i++) {
        finv_temp[i] = mult(finv_temp[i - 1], n - i + 1);
      }
      for (long long i = finv_temp.size() - 1; i >= 0; i--) {
        factorialInv.push_back(finv_temp[i]);
      }
    }
    return factorialInv[n];
  }
  long long pow(long long x, long long e, long long m = mod) {
    if (e < 0) {
      x = inv(x);
      e *= -1;
    }
    long long res = 1;
    while (e > 0) {
      if (e & 1) res = mult(res, x, m);
      e = e >> 1;
      x = mult(x, x, m);
    }
    return res;
  }
  inline long long inv(long long x) { return pow(x, mod - 2); }
  long long fac(long long n) {
    while ((long long)factorial.size() <= n) {
      factorial.push_back(
          mult(factorial[factorial.size() - 1], factorial.size()));
    }
    return factorial[n];
  }
};
bool isprime(long long n) {
  for (long long i = sqrt(n); i > 1; i--) {
    if (n % i == 0) return false;
  }
  return true;
}
bool is_int(long double d) {
  if (d == ceil(d)) return true;
  return false;
}
long long fact(long long x) {
  if (x == 0 || x == 1)
    return 1;
  else
    return x * fact(x - 1);
}
long long gcd(long long n, long long m) {
  if (n % m == 0) return m;
  if (n < m) swap(n, m);
  while (m > 0) {
    n = n % m;
    swap(n, m);
  }
  return n;
}
bool isPowerOfTwo(long long n) {
  if (n == 0) return false;
  return (ceil(log2(n)) == floor(log2(n)));
}
long long binary_search(long long x, long long low, long long high,
                        long long arr[]) {
  if (low == high)
    return low;
  else {
    long long mid = (low + high) / 2;
    if (arr[mid] == x)
      return mid;
    else if (arr[mid] > x)
      return binary_search(x, low, mid - 1, arr);
    else
      return binary_search(x, mid + 1, high, arr);
  }
  return -1;
}
vector<long long> primev;
void SieveOfEratosthenes(long long n) {
  bool prime[n + 1];
  memset(prime, true, sizeof(prime));
  for (long long p = 2; p * p <= n; p++) {
    if (prime[p] == true) {
      for (long long i = p * p; i <= n; i += p) prime[i] = false;
    }
  }
  for (long long p = 2; p <= n; p++)
    if (prime[p]) primev.push_back(p);
}
long long sum_of_digits(long long n) {
  long long res{};
  while (n > 0) {
    res += (n % 10);
    n /= 10;
  }
  return res;
}
void solve() {
  set<pair<string, string>> s;
  long long n;
  cin >> n;
  for (long long i = 0; i < n; i++) {
    string a, b;
    cin >> a >> b;
    s.insert({a, b});
  }
  cout << s.size() << "\n";
}
signed main() {
  long long q = 1;
  while (q--) solve();
}

### Prompt

Generate a cpp solution to the following problem:

Indian summer is such a beautiful time of the year! A girl named Alyona is walking in the forest and picking a bouquet from fallen leaves. Alyona is very choosy — she doesn't take a leaf if it matches the color and the species of the tree of one of the leaves she already has. Find out how many leaves Alyona has picked.

Input

The first line contains an integer n (1 ≤ n ≤ 100) — the number of leaves Alyona has found. The next n lines contain the leaves' descriptions. Each leaf is characterized by the species of the tree it has fallen from and by the color. The species of the trees and colors are given in names, consisting of no more than 10 lowercase Latin letters. A name can not be an empty string. The species of a tree and the color are given in each line separated by a space.

Output

Output the single number — the number of Alyona's leaves.

Examples

Input

5
birch yellow
maple red
birch yellow
maple yellow
maple green


Output

4


Input

3
oak yellow
oak yellow
oak yellow


Output

1

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
struct NumberTheory {
  static const long long mod = 1e9 + 7;
  vector<long long> factorial = {1}, factorialInv = {1};
  inline long long mult(long long a, long long b, long long m = mod) {
    return (a * b) % m;
  }
  inline long long norm(long long x) {
    x %= mod;
    if (x < 0) x += mod;
    return x;
  }
  inline long long div(long long a, long long b) { return mult(a, inv(b)); }
  inline long long sub(long long a, long long b) { return norm(a - b); }
  inline long long add(long long a, long long b) { return (a + b) % mod; }
  long long ncr(long long n, long long r) {
    assert(n >= 0);
    if (r < 0 || n < r) return 0;
    return mult(fac(n), mult(finv(r), finv(n - r)));
  }
  long long npr(long long n, long long r) {
    assert(n >= 0);
    if (r < 0 || n < r) return 0;
    return mult(fac(n), finv(n - r));
  }
  long long finv(long long n) {
    long long last = factorialInv.size() - 1;
    if (last < n) {
      vector<long long> finv_temp(n - last);
      finv_temp[0] = inv(fac(n));
      for (long long i = 1; i < (long long)finv_temp.size(); i++) {
        finv_temp[i] = mult(finv_temp[i - 1], n - i + 1);
      }
      for (long long i = finv_temp.size() - 1; i >= 0; i--) {
        factorialInv.push_back(finv_temp[i]);
      }
    }
    return factorialInv[n];
  }
  long long pow(long long x, long long e, long long m = mod) {
    if (e < 0) {
      x = inv(x);
      e *= -1;
    }
    long long res = 1;
    while (e > 0) {
      if (e & 1) res = mult(res, x, m);
      e = e >> 1;
      x = mult(x, x, m);
    }
    return res;
  }
  inline long long inv(long long x) { return pow(x, mod - 2); }
  long long fac(long long n) {
    while ((long long)factorial.size() <= n) {
      factorial.push_back(
          mult(factorial[factorial.size() - 1], factorial.size()));
    }
    return factorial[n];
  }
};
bool isprime(long long n) {
  for (long long i = sqrt(n); i > 1; i--) {
    if (n % i == 0) return false;
  }
  return true;
}
bool is_int(long double d) {
  if (d == ceil(d)) return true;
  return false;
}
long long fact(long long x) {
  if (x == 0 || x == 1)
    return 1;
  else
    return x * fact(x - 1);
}
long long gcd(long long n, long long m) {
  if (n % m == 0) return m;
  if (n < m) swap(n, m);
  while (m > 0) {
    n = n % m;
    swap(n, m);
  }
  return n;
}
bool isPowerOfTwo(long long n) {
  if (n == 0) return false;
  return (ceil(log2(n)) == floor(log2(n)));
}
long long binary_search(long long x, long long low, long long high,
                        long long arr[]) {
  if (low == high)
    return low;
  else {
    long long mid = (low + high) / 2;
    if (arr[mid] == x)
      return mid;
    else if (arr[mid] > x)
      return binary_search(x, low, mid - 1, arr);
    else
      return binary_search(x, mid + 1, high, arr);
  }
  return -1;
}
vector<long long> primev;
void SieveOfEratosthenes(long long n) {
  bool prime[n + 1];
  memset(prime, true, sizeof(prime));
  for (long long p = 2; p * p <= n; p++) {
    if (prime[p] == true) {
      for (long long i = p * p; i <= n; i += p) prime[i] = false;
    }
  }
  for (long long p = 2; p <= n; p++)
    if (prime[p]) primev.push_back(p);
}
long long sum_of_digits(long long n) {
  long long res{};
  while (n > 0) {
    res += (n % 10);
    n /= 10;
  }
  return res;
}
void solve() {
  set<pair<string, string>> s;
  long long n;
  cin >> n;
  for (long long i = 0; i < n; i++) {
    string a, b;
    cin >> a >> b;
    s.insert({a, b});
  }
  cout << s.size() << "\n";
}
signed main() {
  long long q = 1;
  while (q--) solve();
}

```