487-3279

//方法一:直接调用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();
	}
}

猜你喜欢

转载自hfn.iteye.com/blog/2309443