Problem:
Score : 700 points

Problem Statement

There is an H \times W grid (H vertical, W horizontal), where each square contains a lowercase English letter.
Specifically, the letter in the square at the i-th row and j-th column is equal to the j-th character in the string S_i.

Snuke can apply the following operation to this grid any number of times:

Choose two different rows and swap them. Or, choose two different columns and swap them.

Snuke wants this grid to be symmetric.
That is, for any 1 \leq i \leq H and 1 \leq j \leq W, the letter in the square at the i-th row and j-th column and the letter in the square at the (H + 1 - i)-th row and (W + 1 - j)-th column should be equal.

Determine if Snuke can achieve this objective.

Constraints

1 \leq H \leq 12

1 \leq W \leq 12

|S_i| = W

S_i consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

H W
S_1
S_2
:
S_H

Output

If Snuke can make the grid symmetric, print YES; if he cannot, print NO.

Sample Input 1

2 3
arc
rac

Sample Output 1

YES

If the second and third columns from the left are swapped, the grid becomes symmetric, as shown in the image below:

Sample Input 2

3 7
atcoder
regular
contest

Sample Output 2

NO

Sample Input 3

12 12
bimonigaloaf
faurwlkbleht
dexwimqxzxbb
lxdgyoifcxid
ydxiliocfdgx
nfoabgilamoi
ibxbdqmzxxwe
pqirylfrcrnf
wtehfkllbura
yfrnpflcrirq
wvcclwgiubrk
lkbrwgwuiccv

Sample Output 3

YES

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.util.*;

public class Main{
	public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int h = Integer.parseInt(sc.next());
        int w = Integer.parseInt(sc.next());
        String s;
        Map<Integer, Integer> codec = new HashMap<Integer, Integer>();
        Map<Integer, Integer> coder = new HashMap<Integer, Integer>();
        Integer temp = 0, tmp;
        Integer[] row = new Integer[w];
        int flag = 0;

        for(int i=0; i<w; i++){
        	row[i] = 0;
        }
        
        for(int i=0; i<h; i++){
        	s = sc.next();
        	temp =  0;
        	
        	for(int j=0; j<w; j++){
        		tmp = (int)Math.pow(2, ((int)s.charAt(j)) - 97);
        		temp += tmp;
        		row[j] += tmp;
        	}
        	if(codec.get(temp) == null){
        		codec.put(temp, 1);
        	}else{
        		codec.put(temp, codec.get(temp) + 1);
        	}
        }
        
        for(int j=0; j<w; j++){
        	if(coder.get(row[j]) == null){
        		coder.put(row[j], 1);
        	}else{
        		coder.put(row[j], coder.get(row[j]) + 1);
        	}
        }
        
        for (Integer val : codec.values()) {
			if(h%2 == 1 && val%2 == 1 && flag == 0){
				flag = 1;
			}else if((flag == 1 && val%2 == 1) || (h%2 == 0 && val%2 == 1)){
				System.out.println("NO");
				sc.close();
				return;
			}
		}
        
        flag = 0;
        
        for (Integer val : coder.values()) {
			if(w%2 == 1 && val%2 == 1 && flag == 0){
				flag = 1;
			}else if((flag == 1 && val%2 == 1) || (w%2 == 0 && val%2 == 1)){
				System.out.println("NO");
				sc.close();
				return;
			}
		}

        System.out.println("YES");
        sc.close();
    }
}