using
System;
using
System.Collections.Generic;
class
GFG {
static
int
CompareLists(List<
int
> a, List<
int
> b)
{
if
(a.Count != b.Count) {
return
a.Count - b.Count;
}
for
(
int
i = 0; i < a.Count; i++) {
if
(a[i] != b[i]) {
return
a[i] - b[i];
}
}
return
0;
}
static
int
getCount(
int
N, List<
string
> s)
{
Dictionary<List<
int
>,
int
> mp
=
new
Dictionary<List<
int
>,
int
>(
new
ListComparer());
int
ans = 0;
for
(
int
i = 0; i < N; i++) {
List<
int
> a =
new
List<
int
>(
new
int
[26]);
for
(
int
j = 0; j < s[i].Length; j++) {
a[s[i][j] -
'a'
]++;
}
for
(
int
j = 0; j < 26; j++) {
a[j] %= 2;
}
ans += mp.GetValueOrDefault(a, 0);
for
(
int
j = 0; j < 26; j++) {
List<
int
> changedCount =
new
List<
int
>(a);
if
(a[j] == 0)
changedCount[j] = 1;
else
changedCount[j] = 0;
ans += mp.GetValueOrDefault(changedCount,
0);
}
mp[a] = mp.GetValueOrDefault(a, 0) + 1;
}
return
ans;
}
static
void
Main(
string
[] args)
{
int
N = 6;
List<
string
> A
=
new
List<
string
>{
"aab"
,
"abcac"
,
"dffe"
,
"ed"
,
"aa"
,
"aade"
};
Console.Write(getCount(N, A));
}
}
class
ListComparer : IEqualityComparer<List<
int
> > {
public
bool
Equals(List<
int
> a, List<
int
> b)
{
if
(a.Count != b.Count) {
return
false
;
}
for
(
int
i = 0; i < a.Count; i++) {
if
(a[i] != b[i]) {
return
false
;
}
}
return
true
;
}
public
int
GetHashCode(List<
int
> list)
{
int
hash = 17;
foreach
(
int
element
in
list)
{
hash = hash * 31 + element;
}
return
hash;
}
}