#include <bits/stdc++.h>

	#include <ext/pb_ds/assoc_container.hpp>
	#include <ext/pb_ds/tree_policy.hpp>
	#include <ext/pb_ds/detail/standard_policies.hpp>
	using namespace __gnu_pbds;

	#if !ONLINE_JUDGE
	#define debug
	#endif

	using namespace std;
	 
	/*******  All Required define Pre-Processors and typedef Constants *******/
	#define mem(a, b) memset(a, (b), sizeof(a))
	#define repd(i,k) for(int i=k;i>=0;i--)
	#define rep(i,k) for(int i=0;i<k;i++)
	#define repn(i,k1,k2) for(ll i=k1;i<k2;i++)
	#define sz(x) (ll)(x).size()
	#define ff first
	#define ss second

	#define all(cont) cont.begin(), cont.end()
	#define rall(cont) cont.end(), cont.begin()
	#define mp make_pair
	#define pb push_back
	#define eb emplace_back
	#define INF (int)1e9
	#define EPS 1e-9
	#define PI 3.1415926535897932384626433832795
	#define MOD 1000000007
	#define ee6 (ll)1000001
	#define ee5 (ll)100001

	#define trav(a, v) for(auto& a : v)

	#define tt ll t;cin>>t; while(t--)
	typedef long long int ll;
	 
	typedef pair<ll, ll> pr;
	typedef vector<ll> vi;
	typedef vector<string> vs;
	typedef vector<pr> vpr;
	typedef vector<vpr>vvpr;
	typedef vector<vi> vvi;

	//*X.find_by_order(2) element at index=2
	//X.order_of_key(1) how many elements strictly less than 1

	template <typename T>
	using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,
	    tree_order_statistics_node_update>;

	#ifdef debug
	#define dbg(...) { cerr<<"[ "; dump(#__VA_ARGS__, __VA_ARGS__);}
	#undef endl
	template <typename Arg1,typename Arg2>
	ostream& operator << (ostream& out, const pair<Arg1,Arg2> &x) {
	    return out<<"("<<x.ff<<","<<x.ss<<")";
	}
	 
	template <typename Arg1>
	ostream& operator << (ostream& out, const vector<Arg1> &a) {
	    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
	}
	 
	template <typename Arg1>
	ostream& operator << (ostream& out, const set<Arg1> &a) {
	    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
	}
	 
	template <typename Arg1,typename Arg2>
	ostream& operator << (ostream& out, const map<Arg1,Arg2> &a) {
	    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
	}
	 
	template <typename Arg1,typename Arg2>
	ostream& operator << (ostream& out, const unordered_map<Arg1,Arg2> &a) {
	    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
	} 
	 
	template <typename Arg1>
	void dump(const string name, Arg1&& arg1){
	    cerr << name << " : " << arg1 << " ] " << endl;
	}
	 
	template <typename Arg1, typename... Args>
	void dump(const string names, Arg1&& arg1, Args&&... args){
	    const string name = names.substr(0,names.find(','));
	    cerr<<name<<" : "<<arg1<<" | ";
	    dump(names.substr(1+(int)name.size()), args...);
	}
	#else
	    #define dbg(args...)
	#endif
	 
	ll powmod(ll x, ll y) 
	{ 
	    ll res = 1;  
	    x = x % MOD;
	    while (y > 0) 
	    { 
	        if (y & 1) 
	  	      res = (res*x) % MOD; 
	        y = y>>1; // y = y/2 
	        x = (x*x) % MOD;   
	    } 
	    return res; 
	} 
	ll powe[40];
	map<pair<string,string>,ll>unte;
	int main()
	{
		#if !ONLINE_JUDGE
//		freopen("in.txt","r",stdin);
		#endif
		ios_base::sync_with_stdio(false);
		cin.tie(NULL);

	 	#define mod 1000000003
	 	powe[0]=1;
	 	for(ll i=1;i<40;i++)
	 		powe[i]=(powe[i-1]*mod)%MOD;

	 	ll n;cin>>n;
	 	string s;cin>>s;
	 	reverse(s.begin()+n,s.end());
	 	
	 	string x,y;
	 	for(ll mask=0;mask<(1<<n);mask++){	 		
	 		x.clear(),y.clear();
	 		for(ll bit=0;bit<n;bit++){
	 			if(mask&(1<<bit))
	 				x.pb(s[bit]);
	 			else y.pb(s[bit]);
	 		}
	 		unte[mp(x,y)]++;
	 	}

	 	ll ans=0;

	 	for(ll mask=0;mask<(1<<n);mask++){
	 		x.clear();y.clear();
	 		for(ll bit=0;bit<n;bit++){
	 			if(mask&(1<<bit))
	 				x.pb(s[bit+n]);
	 			else y.pb(s[bit+n]);
	 		}
	 		ans+=unte[mp(x,y)];
	 	}

	 	cout<<ans;
	}

Measured memory_bytes: 91904