#include <bits/stdc++.h>
using namespace std;
#define int long long
string pre, pos;
// s1和s2长度均为k 用前k个小写字母 即每个字母在字符串中只出现一次
int rec1[26]; // 记录小写字母在pre中出现位置
int rec2[26]; // 记录小写字母在pos中出现位置
int m;
int com[21][21];
// com[i][j]表示 Cij 组合数
// 分割子树
// 递归分割 只考虑父节下边有几个孩子
// 考虑前序遍历和后序遍历
// 前序:根 孩子1 孩子2 孩子3
// 后序:孩子1 孩子2 孩子3 根
// 考虑递归分割子树 pre[l1..r1] pos[l2..r2]
int cal(int l1, int r1, int l2, int r2) {
if (l1 == r1) return 1;
int ans = 1;
int rt = l1 + 1; // 第一个子树的根的位置
int start = l2; // 后序中第一个子树的开始位置
int cnt = 0; // 记录该根节点切分的子树数量
while (rt <= r1) {
int idx = rec2[pre[rt] - 'a']; // 子树的根在后序遍历中的位置
int len = idx - start + 1;
// 切分第一颗子树 乘上第一颗子树的数量
ans *= cal(rt, rt + len - 1, start, idx);
cnt++;
rt = rt + len;
start = idx + 1;
}
ans *= com[m][cnt]; // 子树排列数
return ans;
}
signed main() {
for (int i = 0; i < 21; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0) com[i][j] = 1;
else com[i][j] = com[i - 1][j] + com[i - 1][j - 1];
}
}
while (cin >> m) {
if (m == 0) break;
cin >> pre >> pos;
int k = pre.size();
// 每个字母只会出现一次 记录出现位置
for (int i = 0; i < k; i++) {
rec1[pre[i] - 'a'] = i;
rec2[pos[i] - 'a'] = i;
}
cout << cal(0, k - 1, 0, k - 1) << '\n';
}
return 0;
}