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<Long, Integer> codec = new HashMap<Long, Integer>();
        Map<Long, Integer> coder = new HashMap<Long, Integer>();
        Long temp = (long)0;
        Long tmp = (long)0;
        Long[] row = new Long[w];
        int count = 0;

        for(int i=0; i<w; i++){
        	row[i] = (long)0;
        }
        
        for(int i=0; i<h; i++){
        	s = sc.next();
        	temp =  (long)0;
        	
        	for(int j=0; j<w; j++){
        		tmp = (long)Math.pow(3, ((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);
        	}
        }
        
        count = 0;
        
        for (Integer val : codec.values()) {
			if(val%2 == 1){
				count++;
			}
		}
        
        if(count != h%2){
        	System.out.println("NO");
			sc.close();
			return;
        }
        
        count = 0;
        
        for (Integer val : coder.values()) {
			if(val%2 == 1){
				count++;
			}
		}
        
        if(count != w%2){
        	System.out.println("NO");
			sc.close();
			return;
        }

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