SP8491 PHONMESS - Messy Phone List
题目描述
亚当有很多朋友,因此他在他的手机数据库中储存了很多电话号码。由于他的电话不属于最新一代,其数据库有些简单。事实上,所有条目都是逐行存储的,完全按照亚当曾经输入的方式,无论他使用什么格式。不幸的是,他时常改变格式,无法或懒得记住他上次是怎么做的。所以,多年过去了(亚当喜欢他的手机,不想换成现代的),他的电话号码列表已经变得非常混乱,他想做一些清理。你的任务是编写一个程序,为他做清理工作。
每个条目由三部分组成:电话号码、亚当的一个朋友的名字和姓氏。**这些部分的顺序可能有所不同**。一个条目可以从电话号码开始,然后是名字,反之亦然,电话号码和名字之间总是用一个空格分开。名字的两个部分的顺序也可能不同。要么是**先名后姓**,用一个**空格**隔开,要么是**先姓后名**,用一个**逗号**隔开。
一个电话号码可以包含一个可选的前导区号,用一个`-`或一个`/`与本地代码分开。如果没有区号,则假定这个号码为亚当的家乡的区号。区号和本地代码都由至少三位和最多十位数字组成。为了提高可读性,**中间可能会有额外的可选空格**。对于最终的列表,电话号码必须被规范化。**一个规范化的电话号码由区号和本地代码组成,用**`-`**分隔,没有任何空格。**
一个名字由英文字母组成。**大写字母和小写字母可能混在一起**,因为亚当在输入条目时没有注意到这一点。名和姓**各**至少有一个字符,最多有20个字符。对于最后的名单,所有的名字都必须被规范化。**一个规范化的名字除了第一个字母是大写字母,其他字母只由小字母组成**。下面的解释都是指规范化的数字和名字。
如果**两个不同的人有相同的电话号码**,这将被认为是一个错误——这些条目必须**不出现**在最终的列表中。如果**两个条目是相同的,它们必须在最终列表中只出现一次**。如果一个人被列在不同的电话号码上,说明这个人多年来改变了电话号码,将只出现在所列号码中**最新的一个**,这并不因为上述原因而必须被删除。
输入格式
输入以单行的正整数 $t \ (t < 50)$ 开始,然后是 $t$ 个测试用例。每个测试案例以一行开始,包含一个正整数 $n \ (n < 1000)$,电话列表条目的数量,用空格分隔的亚当家乡的区号。然后是 $n$ 行,每行代表电话列表中的一个条目。
输出格式
对于每个测试案例,首先在一行中输出最终列表中的条目数 $k$。然后,后面必须有 $k$ 行,即清理后的电话列表。每一行都是一个条目,必须完全像这样。`[名][空格][姓]:[电话号码]`。为了清楚起见,只用方括号,**方括号无需输出**。列表必须根据姓氏和名字的顺序进行排序,先排序姓氏,再排序名字。