题目链接:http://poj.org/problem?id=1240
好久之前自己写的,今天拿出来看看,越看越喜欢。题目意思,已知前序遍历跟后序遍历,求树共有多少种形态。前一篇随笔中提到了一点。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; const int maxn=27; char s1[maxn],s2[maxn]; int m,ans,pre; int zuhe(int cnt) { int count=1; for(int i=1;i<=cnt;i++) { count*=(m-i+1); count/=i; } return count; } void dfs(int beg,int end) { int cnt=0; for(int i=beg;i<=end;i++) { if(s2[i]==s1[pre]) { cnt++; pre++; dfs(beg,i-1); beg=i+1; } } ans*=zuhe(cnt); } int main() { while(true) { scanf("%d %s %s",&m,s1,s2); // printf("%d %s %s\n",m,s1,s2); if(!m) break; int len=strlen(s1); ans=pre=1; dfs(0,len-2); printf("%d\n",ans); } return 0; }