#include<stdio.h>#include<string.h>
using namespace std;char str1[100], str2[100];int N;long com[100][100];//返回x选y的组合数 //combination:组合 longgetcom(int x,int y){if(y ==0|| x == y)return1;elseif(com[x][y]!=0)return com[x][y];else{
com[x][y]=getcom(x -1, y)+getcom(x -1, y -1);return com[x][y];}}//返回当前递归的这棵树不同形态的数目 //参数:当前递归的这棵树在str1里的起点,终点;在str2里的起点 longcount(int a,int b,int c){long sum =1;int k =0;//统计当前递归的这棵树的子树的数量 int s = a +1, t = c, p;//s:当前递归的这棵树的子树在str1里的起点 if(a == b)return1;//如果只有一个字符,则只有一个形态 while(s <= b){//循环枚举各棵子树
p = t;//p: 当前递归的这棵树的子树在str2里的起点 while(str1[s]!= str2[t]) t ++;//t: 当前递归的这棵树的子树在str2里的终点 //(因为前序遍历的第一个字符和后序遍历的最后一个字符都是根结点,//这样我们就确定了子树字符串的长度)
sum = sum *count(s, s + t - p, p);
s = s + t - p +1;//当前递归的这棵树的下一个子树在str1里的起点
t ++;//当前递归的这颗树的下一个子树在str2里的起点
k ++;//当前递归的这棵树的子树的数量加一 }return sum *getcom(N, k);}intmain(){int len;scanf("%d",&N);scanf("%s%s", str1, str2);
len =strlen(str1);printf("%ld\n",count(0, len -1,0));return0;}/*
输入:
4
abdefgc
defgbca
输出:
6
*/