#P2146. Confusing Login Names
Confusing Login Names
描述
以其在计算机科学领域的研究和教育而闻名。这所大学有一个,该中心拥有先进和安全的计算设施,包括和许多连接到的个人计算机。
的政策之一是让学生选择自己的登录名。遗憾的是,学生很容易选择相似的登录名,并且由于输入或指定登录名的错误而引起的麻烦相对常见。这些麻烦是计算机中心工作人员的负担。
为避免此类麻烦,总经理博士决定杜绝相似且令人困惑的登录名。为此,必须开发一个程序来检测令人困惑的登录名。
根据以下个字符串操作,两个登录名之间的距离被确定为将一个登录名转换为另一个登录名的最小操作数:
1.删除任意位置的字符。
2. 将字符插入任意位置。
3. 将任意位置的字符替换为另一个字符。
4. 在任意位置交换两个相邻字符。
例如,和之间的距离为,因为以下操作序列将转换为:
delete 'o' insert 'i'
omura ---------> mura --------> murai
另一个例子是和之间的距离也是:
swap 'a' and 'k' replace 'a' with 'o'
akasan ---------------> kaasan -------------------> kaason
认为两个距离较短的登录名会让人感到困惑,因此必须避免。
您的工作是编写一个程序来枚举所有令人困惑的登录名对。
请注意,这些规则可能会以微妙的方式组合在一起。例如,和之间的距离是:
swap 'a' and 'n' insert 'e'
ant ---------------> nat ---------> neat
输入
输入由多个数据集组成。每个数据集都以以下格式给出:
n
d
name1
name2
...
namen
第一个整数是登录名的数量。然后是一个正整数。距离小于或等于的两个登录名被视为混淆。您可以假设和。第个学生的登录名由给出,它仅由小写字母组成。它的长度小于。您可以假设中没有重复项()。
输入的结尾由仅包含的行指示。
输出
对于每个数据集,您的程序应输出所有令人困惑的登录名对,每行一对,然后是数据集中令人困惑的登录名对的总数。
在每对登录名中,两个登录名只能用逗号字符()分隔,并且按字母顺序排列在另一个登录名之前的登录名应首先出现。每个数据集的混淆对的整个输出必须按如下方式排序。对于两对和,如果在字母顺序上在之前,或者它们相同且在之前,则必须出现在之前。
输入数据 1
8
2
omura
toshio
raku
tanaka
imura
yoshoi
hayashi
miura
3
1
tasaka
nakata
tanaka
1
1
foo
5
2
psqt
abcdef
abzdefa
pqrst
abdxcef
0
输出数据 1
imura,miura imura,omura miura,omura toshio,yoshoi 4 tanaka,tasaka 1 0 abcdef,abdxcef abcdef,abzdefa pqrst,psqt 3
来源