Problem:
Score : 400 points

Problem Statement

We have an H-by-W matrix.
Let a_{ij} be the element at the i-th row from the top and j-th column from the left.
In this matrix, each a_{ij} is a lowercase English letter.

Snuke is creating another H-by-W matrix, A', by freely rearranging the elements in A.
Here, he wants to satisfy the following condition:

Every row and column in A' can be read as a palindrome.

Determine whether he can create a matrix satisfying the condition.

Note

A palindrome is a string that reads the same forward and backward.
For example, a, aa, abba and abcba are all palindromes, while ab, abab and abcda are not.

Constraints

1 ≤ H, W ≤ 100

a_{ij} is a lowercase English letter.

Input

Input is given from Standard Input in the following format:

H W
a_{11}a_{12}...a_{1W}
:
a_{H1}a_{H2}...a_{HW}

Output

If Snuke can create a matrix satisfying the condition, print Yes; otherwise, print No.

Sample Input 1

3 4
aabb
aabb
aacc

Sample Output 1

Yes

For example, the following matrix satisfies the condition.

abba
acca
abba

Sample Input 2

2 2
aa
bb

Sample Output 2

No

It is not possible to create a matrix satisfying the condition, no matter how we rearrange the elements in A.

Sample Input 3

5 1
t
w
e
e
t

Sample Output 3

Yes

For example, the following matrix satisfies the condition.

t
e
w
e
t

Sample Input 4

2 5
abxba
abyba

Sample Output 4

No

Sample Input 5

1 1
z

Sample Output 5

Yes

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Runtime Error)

import java.util.ArrayList;
import java.util.Scanner;


public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		ArrayList<String> matrix = new ArrayList<String>();
		String s = scanner.nextLine();
		String[] temp = s.split(" ");
		int row = Integer.parseInt(temp[0]);
		int col = Integer.parseInt(temp[1]);
		String[] colStr = new String[col];
		//System.out.println("row: " + row);
		int flag = 0;
		
		for(int i=0;i<row;i++){
			String test = scanner.nextLine();			
			matrix.add(test);
			//System.out.println(i);
			//System.out.println(test);
			
			for(int j=0;j<col;j++){
				char ch = test.charAt(j);
				colStr[i] = colStr[i] + ch;
				if(countOccurrences(test,ch)%2==0){
					;
				}else{
					flag = 1;
					//System.out.println(test.length() - test.replace(".", "").length()%2);
				}
			}
			
		}
		
		for(String c: colStr){
			for(int i=0;i<c.length()-1;i++){
				if(c != null){
				char ch2 = c.charAt(i);
				
				
				if(countOccurrences(c,ch2)%2==0){
					;
				}
				else{
					flag = 1;
			
				}
				}
			}
		}
		
	
		if(flag==0){
			System.out.println("Yes");
		}else{
			System.out.println("No");
		}
	}
	
	public static int countOccurrences(String haystack, char needle)
	{
	    int count = 0;
	    for (int i=0; i < haystack.length(); i++)
	    {
	        if (haystack.charAt(i) == needle)
	        {
	             count++;
	        }
	    }
	    return count;
	}
	

}