#P2146. Confusing Login Names

Confusing Login Names

描述

名京馆大学名京馆大学以其在计算机科学领域的研究和教育而闻名。这所大学有一个计算机中心计算机中心,该中心拥有先进和安全的计算设施,包括超级计算机超级计算机和许多连接到InternetInternet的个人计算机。

计算机中心计算机中心的政策之一是让学生选择自己的登录名。遗憾的是,学生很容易选择相似的登录名,并且由于输入或指定登录名的错误而引起的麻烦相对常见。这些麻烦是计算机中心工作人员的负担。

为避免此类麻烦,计算机中心计算机中心总经理ChoeiTakanoChoei Takano博士决定杜绝相似且令人困惑的登录名。为此,TakanoTakano必须开发一个程序来检测令人困惑的登录名。

根据以下44个字符串操作,两个登录名之间的距离被确定为将一个登录名转换为另一个登录名的最小操作数:

1.删除任意位置的字符。
2. 将字符插入任意位置。
3. 将任意位置的字符替换为另一个字符。
4. 在任意位置交换两个相邻字符。

例如,omura“omura”murai“murai”之间的距离为22,因为以下操作序列将omura“omura”转换为murai“murai”

 delete 'o'      insert 'i'  
omura ---------> mura --------> murai

另一个例子是akasan“akasan”kaason“kaason”之间的距离也是22

   swap 'a' and 'k'        replace 'a' with 'o'  
akasan ---------------> kaasan -------------------> kaason

TakanoTakano认为两个距离较短的登录名会让人感到困惑,因此必须避免。

您的工作是编写一个程序来枚举所有令人困惑的登录名对。

请注意,这些规则可能会以微妙的方式组合在一起。例如,ant“ant”neat“neat”之间的距离是22

swap 'a' and 'n'     insert 'e'  
ant ---------------> nat ---------> neat

输入

输入由多个数据集组成。每个数据集都以以下格式给出:

n
d
name1
name2
...
namen

第一个整数nn是登录名的数量。然后是一个正整数dd。距离小于或等于dd的两个登录名被视为混淆。您可以假设0<n<=2000 < n <= 2000<d<=20 < d <= 2。第ii个学生的登录名由nameinamei给出,它仅由小写字母组成。它的长度小于1616。您可以假设nameinamei中没有重复项(1<=i<=n1 <= i <= n)。

输入的结尾由仅包含00的行指示。

输出

对于每个数据集,您的程序应输出所有令人困惑的登录名对,每行一对,然后是数据集中令人困惑的登录名对的总数。

在每对登录名中,两个登录名只能用逗号字符()分隔,并且按字母顺序排列在另一个登录名之前的登录名应首先出现。每个数据集的混淆对的整个输出必须按如下方式排序。对于两对w1w2“w1,w2”w3w4“w3,w4”,如果w1w1在字母顺序上在w3w3之前,或者它们相同且w2w2w4w4之前,则w1w2“w1,w2”必须出现在w3w4“w3,w4”之前。

输入数据 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

来源

日本2004日本 2004