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; }
浙公网安备 33010602011771号