#include "bits/stdc++.h"
using namespace std;

//

#define RESIDUE(u,v) (capacity[u][v] - flow[u][v])
#define RCOST(u,v) (cost[u][v] + h[u] - h[v])
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)   FOR(i,0,n)
#define LL long long

int n;
string s,t,u;

string s1,s2;

unordered_map<string,LL> mp;
 
LL ret=0;

int main(){
  cin>>n>>s;
  t=s.substr(0,n);
  u=s.substr(n,2*n);
  
  REP(i,1<<n){
    s1="";
    s2="";
    REP(j,n){
      if((i>>j)%2)
	s1=t[j]+s1;
      else
	s2=t[j]+s2;
    }
    mp[s1+" "+s2]++;
  }

  reverse(u.begin(),u.end());
  
  REP(i,1<<n){
    s1="";
    s2="";
    REP(j,n){
      if((i>>j)%2)
	s1=u[j]+s1;
      else
	s2=u[j]+s2;
    }
    ret+=mp[s1+" "+s2];
  }
      
  cout<<ret<<endl;
  return 0;
}

### Prompt

Your challenge is to write a cpp solution to the following problem:

You are given a string S of length 2N consisting of lowercase English letters.

There are 2^{2N} ways to color each character in S red or blue. Among these ways, how many satisfy the following condition?

* The string obtained by reading the characters painted red from left to right is equal to the string obtained by reading the characters painted blue from right to left.

Constraints

* 1 \leq N \leq 18
* The length of S is 2N.
* S consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:


N
S


Output

Print the number of ways to paint the string that satisfy the condition.

Examples

Input

4
cabaacba


Output

4


Input

11
mippiisssisssiipsspiim


Output

504


Input

4
abcdefgh


Output

0


Input

18
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa


Output

9075135300

### Response

```cpp
#include "bits/stdc++.h"
using namespace std;

//

#define RESIDUE(u,v) (capacity[u][v] - flow[u][v])
#define RCOST(u,v) (cost[u][v] + h[u] - h[v])
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)   FOR(i,0,n)
#define LL long long

int n;
string s,t,u;

string s1,s2;

unordered_map<string,LL> mp;
 
LL ret=0;

int main(){
  cin>>n>>s;
  t=s.substr(0,n);
  u=s.substr(n,2*n);
  
  REP(i,1<<n){
    s1="";
    s2="";
    REP(j,n){
      if((i>>j)%2)
	s1=t[j]+s1;
      else
	s2=t[j]+s2;
    }
    mp[s1+" "+s2]++;
  }

  reverse(u.begin(),u.end());
  
  REP(i,1<<n){
    s1="";
    s2="";
    REP(j,n){
      if((i>>j)%2)
	s1=u[j]+s1;
      else
	s2=u[j]+s2;
    }
    ret+=mp[s1+" "+s2];
  }
      
  cout<<ret<<endl;
  return 0;
}

```