电话号码的标准形式是七位十进制数字,在它的第三位和第四位之间用连字符连接(例如:666-1200)。电话的键盘提供了字符与数字之间的映射关系,如下所示:
2 | A、B和C |
3 | D、E和F |
4 | G、H和I |
5 | J、K和L |
6 | M、N和O |
7 | P、R和S |
8 | T、U和V |
9 | W、X和Y |
Q 和 Z 没有映射到键盘,而连字符不需要被拨打并且可以根据需要添加和删除。MON-GLOP 的标准形式是 666-4567,310-GINO 的标准形式是310-4466,3-10-10-10的标准形式也是 310-1010。
如果两个电话号码有相同的标准形式,那么这两个电话号码是相同的。
你所在的公司正在编辑一本当地商业单位的电话簿,作为质量控制流程的一部分,你需要确认在该电话簿中有没有错误的电话号码,以及有没有两个(或两个以上的)商业单位使用相同的电话号码。由于当地只使用了 3 和 6 两个区段,因此电话号码的第一个数字应当永远是 3 或者 6,如果出现了其它数字,就表示这个电话号码错了。此外,如果电话号码中出现了 Q 和 Z,也说明这个电话错了。
输入
一次输入为一个样例。每个号码一行,每行的字符不会超过 20 个。每次输入的数据可能会非常大,譬如超过 1,000,000 个电话号码。
你可以假设输入中可能会出现重复的电话号码不超过 1,500 个,每个号码重复的次数不超过 1000 次。
输出
输出包括两个部分,第一个部分是错误的电话号码,对于这些号码应当按照输入的顺序以原始的形式输出。在输出错误电话号码前输出“Error:”,随后输出这些号码,如果没有错误的电话号码,则输出“Not found.”。
第二部分是重复的电话号码,对每一个在电话簿中以任何形式出现一次以上的电话号码,生成一行输出。这一行应以标准形式给出电话号码,其后跟随一个空格,空格后跟随电话号码在电话簿中出现的次数。所有重复的电话号码输出行应以号码的升序排列(小号码在前)。在输出重复电话号码前输出“Duplication”,随后按照上述格式输出号码,如果在输入中没有重复的电话号码,则输出:“Not found.”。
注意
你所编写的程序以后可能会在一种特殊的嵌入式设备上运行,为了降低成本,这种设备使用的 CPU 不是很快、可用的 RAM 为 288K(跟 GBA 一样)且它没有磁盘设备因此不能使用文件作为数据的临时存储。
提示
请参考《编程珠玑》第一部分,若程序不能在规定的内存中运行,则不得分。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 512KB | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 512KB | 0 |
c数组开125000(防止爆内存),储存6开头的,还有一个b储存3开头的。一开始初始化的时候让c数组是0,所以在第一次访问的时候c[i/8]&1<<(i%8)肯定是0.如果它是0,就要标记一下让程序知道它已经被访问过了,这时就c[i/8]=c[i/8]|1<<(i%8)。由于开的是125000=1e6/8,所以t=i/8,t有可能会是8个数(8*t+0/1/2/3/4/5/6/7),然后再用i%8来标记,因为k=i%8,那么i=8*t+k。让1向左移k个单位,那么之后c[i/8]=1<<(i%8)。下次再走到这个i的时候,c[i/8]=1<<(i%8),和1<<(i%8)再进行&运算的时候值就是1<<(i%8)了。用这个来记录是否是第一次访问这个数,感觉很厉害。