CF883F Lost in Transliteration

题目描述

在使用拉丁字母书写 Berland 名字时,存在一些歧义。 例如,Berland 中的音节 u 可以用拉丁字母写作 "u",也可以写作 "oo"。因此,"ulyana" 和 "oolyana" 表示的是同一个名字。 第二个歧义是关于 Berland 的音节 h:既可以用 "h" 表示,也可以用 "kh" 表示。例如,"mihail" 和 "mikhail" 表示同一个名字。 现在 Polycarp 的网站上注册了 $n$ 个用户,每个人都用拉丁字母输入了一个名字。如果考虑以上两种歧义,那么这些名字中有多少个不同的名字? 形式化地说,如果可以通过对任意两个单词使用 “u” $\leftrightarrow$ “oo” 和 “h” $\leftrightarrow$ “kh” 的替换任意多次,使得两个单词相同,则它们表示同一个名字。你可以在任意一个单词上,以任意次数、任意方向进行替换。一个通过前面替换得到的字母,也可以参与下一次替换。 例如,下列单词对表示同一个名字: - "koouper" 和 "kuooper"。通过上述替换,可以将它们都变成 "kuuper":"koouper" $\rightarrow$ "kuuper","kuooper" $\rightarrow$ "kuuper"。 - "khun" 和 "kkkhoon"。通过上述替换,可以将它们都变成 "khoon":"khun" $\rightarrow$ "khoon","kkkhoon" $\rightarrow$ "kkhoon" $\rightarrow$ "khoon"。 给定一个单词列表,请找出这些单词表示名字的不重复组数。

输入格式

第一行包含一个整数 $n$($2 \leq n \leq 400$),表示单词的数量。 接下来的 $n$ 行,每行一个单词。每个单词只包含小写拉丁字母,长度为 $1$ 到 $20$ 个字母。

输出格式

输出这些单词中,不同名字的最小组数。

说明/提示

在第一个样例中,共有四组名字,每组中的单词表示同一个名字: 1. "mihail"、"mikhail" 2. "oolyana"、"ulyana" 3. "kooooper"、"koouper" 4. "hoon"、"khun"、"kkkhoon" 在第二个样例中,共有五组名字,每组中的单词表示同一个名字: 1. "hariton"、"kkkhariton"、"khariton" 2. "hkariton" 3. "buoi"、"boooi"、"boui" 4. "bui" 5. "boi" 在第三个样例中,所有单词都相同,因此它们表示同一个名字。 由 ChatGPT 5 翻译