import collections



chars = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",

         "w", "x", "y", "z"]





def eratosthenes_sieve(n):

    primes = [2]

    for odd in range(3, n + 1, 2):

        for p in primes:

            if odd % p == 0:

                break

            if p ** 2 > odd:

                primes.append(odd)

                break

    return primes





era = eratosthenes_sieve(150)

n = int(eval(input()))

array = [0] * n

for i in range(n):

    new = eval(input())

    var = 1



    for j in range(10):

        h = chars.index(new[j])

        var *= era[h]



    array[i] = var



c = collections.Counter(array)

cv = list(c.values())

ans = 0

for i in range(len(c)):

    ans += cv[i] * (cv[i] - 1) // 2



print(ans)

# ABC137C_GreenBin.py

# ちなみに D は DP, E は ヘルマンフォード法 の良問。



import collections



"""

英子文字 26 個を素数で置き換えて掛け合わせると、アナグラムの組は同じ値となる。

1 <= i < j <= n であって、 si が sj のアナグラムであるようなものの個数を求める。

"""





def eratosthenes_sieve(n):

    primes = [2]

    for odd in range(3, n + 1, 2):

        for p in primes:

            if odd % p == 0:

                break

            if p ** 2 > odd:

                primes.append(odd)

                break

    return primes





# 入力と同時にアナグラムを素数の積に変換

Era = eratosthenes_sieve(150)  # 小さいほうから素数 26 個あまり用意する

chars = "abcdefghijklmnopqrstuvwxyz"  # Python では文字列もイテラブル

N = int(eval(input()))

array = [0] * N

for i in range(N):

    new = eval(input())

    var = 1

    for j in range(10):

        h = chars.index(new[j])

        var *= Era[h]

    array[i] = var



# 加工と出力

kinds = collections.Counter(array)

kind = list(kinds.values())

print((sum(kind[i] * (kind[i] - 1) // 2 for i in range(len(kinds)))))



"""

# collection モジュールのまとめ

Counter は辞書型 dict のサブクラスで、キーに要素、値に出現回数という形のデータを持つ。

キーのリスト（keys()メソッド）、値のリスト（values()）、

キーと値のペアのタプルのリスト（items()メソッド）を取得したりできる。

リストに変換したい場合はlist()を使えばよい。

"""

import collections

chars = [
    "a",
    "b",
    "c",
    "d",
    "e",
    "f",
    "g",
    "h",
    "i",
    "j",
    "k",
    "l",
    "m",
    "n",
    "o",
    "p",
    "q",
    "r",
    "s",
    "t",
    "u",
    "v",
    "w",
    "x",
    "y",
    "z",
]


def eratosthenes_sieve(n):
    primes = [2]
    for odd in range(3, n + 1, 2):
        for p in primes:
            if odd % p == 0:
                break
            if p**2 > odd:
                primes.append(odd)
                break
    return primes


era = eratosthenes_sieve(150)
n = int(eval(input()))
array = [0] * n
for i in range(n):
    new = eval(input())
    var = 1
    for j in range(10):
        h = chars.index(new[j])
        var *= era[h]
    array[i] = var
c = collections.Counter(array)
cv = list(c.values())
ans = 0
for i in range(len(c)):
    ans += cv[i] * (cv[i] - 1) // 2
print(ans)

# ABC137C_GreenBin.py
# ちなみに D は DP, E は ヘルマンフォード法 の良問。
import collections

"""
英子文字 26 個を素数で置き換えて掛け合わせると、アナグラムの組は同じ値となる。
1 <= i < j <= n であって、 si が sj のアナグラムであるようなものの個数を求める。
"""


def eratosthenes_sieve(n):
    primes = [2]
    for odd in range(3, n + 1, 2):
        for p in primes:
            if odd % p == 0:
                break
            if p**2 > odd:
                primes.append(odd)
                break
    return primes


# 入力と同時にアナグラムを素数の積に変換
Era = eratosthenes_sieve(150)  # 小さいほうから素数 26 個あまり用意する
chars = "abcdefghijklmnopqrstuvwxyz"  # Python では文字列もイテラブル
N = int(eval(input()))
array = [0] * N
for i in range(N):
    new = eval(input())
    var = 1
    for j in range(10):
        h = chars.index(new[j])
        var *= Era[h]
    array[i] = var
# 加工と出力
kinds = collections.Counter(array)
kind = list(kinds.values())
print((sum(kind[i] * (kind[i] - 1) // 2 for i in range(len(kinds)))))
"""
# collection モジュールのまとめ
Counter は辞書型 dict のサブクラスで、キーに要素、値に出現回数という形のデータを持つ。
キーのリスト（keys()メソッド）、値のリスト（values()）、
キーと値のペアのタプルのリスト（items()メソッド）を取得したりできる。
リストに変換したい場合はlist()を使えばよい。
"""

+# ABC137C_GreenBin.py +# ちなみに D は DP, E は ヘルマンフォード法 の良問。 -chars = [ -    "a", -    "b", -    "c", -    "d", -    "e", -    "f", -    "g", -    "h", -    "i", -    "j", -    "k", -    "l", -    "m", -    "n", -    "o", -    "p", -    "q", -    "r", -    "s", -    "t", -    "u", -    "v", -    "w", -    "x", -    "y", -    "z", -] +""" +英子文字 26 個を素数で置き換えて掛け合わせると、アナグラムの組は同じ値となる。 +1 <= i < j <= n であって、 si が sj のアナグラムであるようなものの個数を求める。 +""" -era = eratosthenes_sieve(150) -n = int(eval(input())) -array = [0] * n -for i in range(n): +# 入力と同時にアナグラムを素数の積に変換 +Era = eratosthenes_sieve(150)  # 小さいほうから素数 26 個あまり用意する +chars = "abcdefghijklmnopqrstuvwxyz"  # Python では文字列もイテラブル +N = int(eval(input())) +array = [0] * N +for i in range(N): -        var *= era[h] +        var *= Era[h] -c = collections.Counter(array) -cv = list(c.values()) -ans = 0 -for i in range(len(c)): -    ans += cv[i] * (cv[i] - 1) // 2 -print(ans) +# 加工と出力 +kinds = collections.Counter(array) +kind = list(kinds.values()) +print((sum(kind[i] * (kind[i] - 1) // 2 for i in range(len(kinds))))) +""" +# collection モジュールのまとめ +Counter は辞書型 dict のサブクラスで、キーに要素、値に出現回数という形のデータを持つ。 +キーのリスト（keys()メソッド）、値のリスト（values()）、 +キーと値のペアのタプルのリスト（items()メソッド）を取得したりできる。 +リストに変換したい場合はlist()を使えばよい。 +"""