POJ1240----Pre-Post-Erous!
/*POJ1240Pre-Post-erous*/
#include <iostream>
#include <cstring>
#include<cstdio>
using namespace std;
char pre[30],post[30];
int num;
int C(int n, int k)                          //计算组合数C(n, k)
{
    int i, sum= 1;
    if (k>(n>>2)) k = n - k;
    for (i = 1; i <= k; ++i)
    sum=sum*(n - i + 1) / i;
    return sum;
}
/*第一个参数当前需要统计节点的总长度(包括当前节点)
第二个参数当前前序节点,第三个参数,当前后序节点*/
int find(int len,char *pre,char *post)
{
	int left=1,right=0,child=0,res=1;
	while(left<len){
		++child;
		while(pre[left]!=post[right])
			++right;
		res*=find(right-left+2,pre+left,post+left-1);
		left=right+2;//下个分支
	}
	return res*C(num,child);
}
int main()
{
	while(~scanf("%d",&num)&&num)
	{
        scanf("%s%s",pre,post);
		printf("%d\n",find(strlen(pre),pre,post));
	}
	return 0;
}
                    
                
                
            
        
浙公网安备 33010602011771号