using
System;
class
GFG {
static
int
Find(
int
[] parent,
int
a)
{
return
parent[a]
= (parent[a] == a ? a
: Find(parent, parent[a]));
}
static
void
Union(
int
[] parent,
int
[] rank,
int
a,
int
b)
{
a = Find(parent, a);
b = Find(parent, b);
if
(rank[a] == rank[b])
rank[a]++;
if
(rank[a] > rank[b])
parent[b] = a;
else
parent[a] = b;
}
static
void
numOfDistinctStrings(
string
[] arr,
int
N)
{
int
[] parent =
new
int
[(27)];
int
[] rank =
new
int
[(27)];
for
(
int
j = 0; j < 27; j++) {
parent[j] = j;
}
bool
[] total =
new
bool
[26];
bool
[] current =
new
bool
[26];
for
(
int
i = 0; i < N; i++) {
for
(
int
j = 0; j < 26; j++) {
current[j] =
false
;
}
foreach
(
char
ch
in
arr[i])
{
current[ch -
'a'
] =
true
;
}
for
(
int
j = 0; j < 26; j++) {
if
(current[j]) {
total[j] =
true
;
Union(parent, rank, arr[i][0] -
'a'
, j);
}
}
}
int
distCount = 0;
for
(
int
i = 0; i < 26; i++) {
if
(total[i] && Find(parent, i) == i) {
distCount++;
}
}
Console.WriteLine(distCount);
}
public
static
void
Main()
{
string
[] arr = {
"a"
,
"ab"
,
"b"
,
"d"
};
int
N = arr.Length;
numOfDistinctStrings(arr, N);
}
}