PKU POJ 1240 Pre-Post-erous! 搜索

题目意思很明确,给点一个m叉树的前序访问s1和后续访问s2,计算出所有可能的m叉树的总数。

用搜索分层进行可以计算,这里注意组合数的计算,不要溢出。
#include<iostream>
#include <string.h>
#include <string>
using namespace std;
int m;
char s1[30],s2[30];
int c(int r,int n)
{
    int res=1;
    for (int i=1;i<=r;++i)
        res=res*(n-r+i)/i;
    return res;
}
int searchin2(char c)
{
    for (int i=0;i<strlen(s2);++i)
        if (s2[i]==c)
            return i;
}
int count(int l1,int r1,int l2,int r2)
{
    if(l1==r1)
        return 1;
    else
    {
        int cnt=1,sun=0,i=l1+1,o=l2-1;
        while (i<=r1)
        {
            sun++;
            int tmp=searchin2(s1[i]);
            cnt*=count(i,i+tmp-o-1,o+1,tmp);
            i+=tmp-o;
            o=tmp;
        }
        return cnt*c(sun,m);
    }
}
int main()
{
    while (scanf("%d",&m)!=EOF&&m)
    {
        scanf("%s%s",s1,s2);
        printf("%d\n",count(0,strlen(s1)-1,0,strlen(s2)-1));
    }
    return 0;
}

 

posted on 2013-03-04 18:14  Deller  阅读(150)  评论(0)    收藏  举报

导航