//方法一:直接调用TreeMap,9040K/3516MS
//Main.java
import java.io.*;
import java.util.Set;
import java.util.TreeMap;
public class Main{
//键值用Integer会比用String效率高一点
private static int[] LETTER2NUMBER={
2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,-1,7,7,8,8,8,9,9,9,-1};
//LETTER2NUMBER['D'-'A']=3
private static int[] scale={1000000,100000,10000,1000,100,10,1};
public static void main(String[] args)throws IOException{
BufferedReader cin=new BufferedReader(new InputStreamReader(System.in));
int count=Integer.parseInt(cin.readLine());
TreeMap<Integer,Integer> map=new TreeMap<Integer,Integer>();
for(int i=0;i<=count-1;i++){
int pos=0;
String tmp=cin.readLine();
Integer result=0;
for(int j=0;j<=tmp.length()-1;j++){
if(tmp.charAt(j)=='-')continue;
if(tmp.charAt(j)>='A'){
//思考为什么不用加&&tmp[j]<='Z'
result+=LETTER2NUMBER[tmp.charAt(j)-'A']*scale[pos];
pos++;
}
else{
result+=(tmp.charAt(j)-'0')*scale[pos];
pos++;
}
}
if(map.containsKey(result)){
map.put(result, map.get(result)+1);
}
else map.put(result,1);
}
Set<Integer> keys=map.keySet();
int mark=0;
for(Integer key:keys){
int times=map.get(key);
if(times!=1){
mark=1;
System.out.printf("%03d-%04d %d\n",key/10000,key%10000,times);
}
}
if(mark==0)System.out.println("No duplicates.");
cin.close();
}
}
//方法二:调用Arrays.sort(number),5948K/3313MS
//Main.java
import java.io.*;
import java.util.Arrays;
public class Main{
private static int[] LETTER2NUMBER={
2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,-1,7,7,8,8,8,9,9,9,-1};
//LETTER2NUMBER['D'-'A']=3
private static int[] scale={1000000,100000,10000,1000,100,10,1};
private static void PrintCount(int[] x){
int mark=0,count=1;
for(int i=1;i<=x.length-1;i++){
//准备输出的两种情况:遇到不同值,遇到数组尾
if(x[i]!=x[i-1]||i==x.length-1){
if(x[i]==x[i-1])count++;
if(count<=1)continue;
//注意这里是i-1而非i
System.out.printf("%03d-%04d %d\n",x[i-1]/10000,x[i-1]%10000,count);
mark=1;count=1;
}
else count++;
}
if(mark==0)System.out.println("No duplicates.");
}
public static void main(String[] args)throws IOException{
BufferedReader cin=new BufferedReader(new InputStreamReader(System.in));
int count=Integer.parseInt(cin.readLine());
int[] number=new int[count];
for(int i=0;i<=count-1;i++){
int pos=0;
String tmp=cin.readLine();
for(int j=0;j<=tmp.length()-1;j++){
if(tmp.charAt(j)=='-')continue;
if(tmp.charAt(j)>='A'){
//思考为什么不用加&&tmp[j]<='Z'
number[i]+=LETTER2NUMBER[tmp.charAt(j)-'A']*scale[pos];
pos++;
}
else{
number[i]+=(tmp.charAt(j)-'0')*scale[pos];
pos++;
}
}
}
Arrays.sort(number);
PrintCount(number);
cin.close();
}
}
//方法三:手写QSort并优化,5944K/3297MS
//聚集相等元素可以提升QSort性能
//普通QSort:4523/5/87589
//改进QSort:423/555/8789
//Main.java
import java.io.*;
class Sort{
public static void QSort(int[] x,int left,int right){
if(left>=right)return;
int l=left,r=right;
int tag=x[left];
int sl=left,sr=right;
//用于标记左右两端已获得的相等元素
while(l!=r){
while(r>l&&x[r]>=tag){
if(x[r]==tag){
x[r]=x[sr];
x[sr]=tag;
sr--;
}//将相等元素移至末端
r--;
}
x[l]=x[r];
while(l<r&&x[l]<=tag){
if(x[l]==tag){
x[l]=x[sl];
x[sl]=tag;
sl++;
}//将相等元素移至末端
l++;
}
x[r]=x[l];
}
x[l]=tag;
//将两端的相等元素交换至枢轴附近
for(int i=left;i<=sl-1;i++){
x[i]=x[l-1-(i-left)];
x[l-1-(i-left)]=tag;
}
for(int i=right;i>=sr+1;i--){
x[i]=x[l+1+(right-i)];
x[l+1+(right-i)]=tag;
}
QSort(x,left,l-1-(sl-left));
QSort(x,l+1+(right-sr),right);
}
public static void PrintCount(int[] x){
int mark=0,count=1;
for(int i=1;i<=x.length-1;i++){
//准备输出的两种情况:遇到不同值,遇到数组尾
if(x[i]!=x[i-1]||i==x.length-1){
if(x[i]==x[i-1])count++;
if(count<=1)continue;
//注意这里是i-1而非i
System.out.printf("%03d-%04d %d\n",x[i-1]/10000,x[i-1]%10000,count);
mark=1;count=1;
}
else count++;
}
if(mark==0)System.out.println("No duplicates.");
}
}
public class Main{
private static int[] LETTER2NUMBER={
2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,-1,7,7,8,8,8,9,9,9,-1};
//LETTER2NUMBER['D'-'A']=3
private static int[] scale={1000000,100000,10000,1000,100,10,1};
public static void main(String[] args)throws IOException{
BufferedReader cin=new BufferedReader(new InputStreamReader(System.in));
int count=Integer.parseInt(cin.readLine());
int[] number=new int[count];
for(int i=0;i<=count-1;i++){
int pos=0;
String tmp=cin.readLine();
for(int j=0;j<=tmp.length()-1;j++){
if(tmp.charAt(j)=='-')continue;
if(tmp.charAt(j)>='A'){
//思考为什么不用加&&tmp[j]<='Z'
number[i]+=LETTER2NUMBER[tmp.charAt(j)-'A']*scale[pos];
pos++;
}
else{
number[i]+=(tmp.charAt(j)-'0')*scale[pos];
pos++;
}
}
}
Sort.QSort(number, 0, number.length-1);
Sort.PrintCount(number);
cin.close();
}
}