import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.PrintStream;
import java.io.File;
import java.util.Vector;

public class Multiple {
	int[] binomial;			
	Vector<File> inputFile;
	Vector<File> outputFile;
	
	public static void main(String[] args) throws IOException{
		long millis = System.currentTimeMillis();
		
		Multiple multi = new Multiple();
		boolean succeed = multi.setFileNames(args);
		if( !succeed ){
			multi.Usage();
			System.exit(0);
		}
        try{
        	int inputFileSize = multi.inputFile.size();
			PrintStream p0 = new PrintStream(multi.outputFile.elementAt(0));
            BufferedReader d0[] = new BufferedReader[inputFileSize];
            String[] strArr = new String[inputFileSize];
    		for(int i=0;i<inputFileSize;i++){ // init
    			d0[i] = new BufferedReader(new FileReader(multi.inputFile.elementAt(i)));			
    		}
   			try{
   	            while(true){
  	        		for(int i=0;i<inputFileSize;i++){
  	        			strArr[i] = d0[i].readLine();
  	        		}
	                p0.println(multi.uniqueCheck(strArr));
    	        }
    	    }catch(EOFException e){   // end of file
    	    }catch(NullPointerException e){
        		for(int i=0;i<inputFileSize;i++){ // init
        			d0[i].close();
        		}
    		}        	
        }catch(FileNotFoundException e){}

        //total
		for(int k=0;k<multi.binomial.length;k++){
	        System.out.print(k);
	        System.out.print("\t");
	        System.out.print(multi.binomial[k]);
	        System.out.println();
		}
		System.out.print(System.currentTimeMillis()-millis);
		System.out.println("ms");
	}

	public void Usage() {
		System.out.println("Usage:");
		System.out.println("java Multiple -i inputfile1.txt -w workDir1 workDir2 -o outputDir");
	}

	public Multiple(){  // constructor 
		inputFile = new Vector<File>();
		outputFile = new Vector<File>();
	}
	
	public String uniqueCheck(String[] seqArr)  throws NullPointerException {
		//check the data
		if ( seqArr==null ) throw new NullPointerException();  // no data
        if ( seqArr.length==0 ) throw new NullPointerException(); // no data
        int trial = seqArr.length;  // data size 
        if ( (trial==0) || (seqArr[0].charAt(0)=='>') ) {
        	return seqArr[0]; // title
        }
        //work
		StringBuffer result = new StringBuffer();
		for(int i=0;i<seqArr[0].length();i++){
			boolean isUnique = false;
			for(int k=0;k<trial;k++){
    			if(Character.isUpperCase(seqArr[k].charAt(i))){
    				isUnique = true;  // unique
    			}
			}
			if(isUnique){  // if at least one is unique
				int multiple = 0;
                for(int k=0;k<trial;k++){
        			if(Character.isLowerCase( seqArr[k].charAt(i) )){
        				multiple ++; //  hash collision
        			}
                }
                binomial[multiple]++;
			}
			if(isUnique) result.append(Character.toUpperCase(seqArr[0].charAt(i)));
			else	     result.append(Character.toLowerCase(seqArr[0].charAt(i)));				
		}
		return result.toString();
	}
	
	public boolean setFileNames(String[] args){
		boolean success = false;
		if(args.length==0) return false;  // no data
		int input = 1;
		int inputDir = 2;
		int outputDir = 3;
		int argState = input; //default
		String targetFileName = "chr22.fa";
		String outputPath = "output";
		Vector<String> inputDirList = new Vector<String>();
		for(int i=0;i<args.length;i++){
			if (args[i].charAt(0)=='-') { // flag
				if( args[i].equals("-i") )  argState = input;
				if( args[i].equals("-w") )  argState = inputDir;				
				if( args[i].equals("-o") )  argState = outputDir;				
			}else{
				if(argState==input)     targetFileName = args[i];
				if(argState==inputDir ) inputDirList.add(args[i]);
				if(argState==outputDir) outputPath = args[i];
			}
		}
		File f = new File(outputPath);
		if( !(f.exists()) ) f.mkdirs();
		if( inputDirList.size()==0 ) inputDirList.add(System.getProperty("user.dir"));
		for(int i=0;i<inputDirList.size();i++){
			inputFile.add(new File(inputDirList.elementAt(i),targetFileName));
			System.out.println(inputFile.elementAt(i).toString());
		}
		outputFile.add(new File(outputPath,targetFileName));

		long mem = Runtime.getRuntime().maxMemory();
		System.out.println(mem);
		int trial = inputFile.size();
		binomial = new int[trial]; // both strand
		success = true;
		return success;
	}
}
