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

Solution (in CPP):

Solution:
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;
using lint=long long;

int main(){
	int n;
	string s; cin>>n>>s;

	lint ans=0;
	rep(S,1<<n){
		string t1,t2;
		rep(i,n){
			if(S>>i&1) t1+=s[i];
			else       t2+=s[i];
		}
		reverse(t1.begin(),t1.end());
		reverse(t2.begin(),t2.end());

		int m=t1.length();
		lint dp[19][19]={}; // dp[i][j] := t1[0,i) と t2[0,j) を使って s[n,n+i+j) を作る方法の数
		dp[0][0]=1;
		rep(k,n+1){
			rep(i,k+1){
				int j=k-i;
				if(i< m  && s[n+k]==t1[i]) dp[i+1][j]+=dp[i][j];
				if(j<n-m && s[n+k]==t2[j]) dp[i][j+1]+=dp[i][j];
			}
		}
		ans+=dp[m][n-m];
	}
	cout<<ans<<'\n';

	return 0;
}