//树的遍历 //几个结论 //1:前序遍历第一个元素是根,后序遍历最后一个元素是根 //2:前序遍历第二个元素是某子树的根,但左右不确定 //3:在后序遍历中找到前序遍历的第二个元素,那么以这个元素为基准,可以划分新的左右子树 //4:当前序遍历的第二个元素出现在后序遍历的倒数第二位,以后序遍历倒数第三位起向左数都是子树的元素,但是左右不确定,因此有2种情况 //递归处理 + 乘法原理 #include<iostream> #include<cstring> using namespace std; int ans; char pre[26],post[26]; void work(int x1,int y1,int x2,int y2) { int pos; if(x1 >= y1) return; for(int i = x2;i < y2;++i) if(pre[x1+1] == post[i]) pos = i; if(pos == y2 - 1) ans *= 2; work(x1+1,x1+1+(pos-x2),x2,pos); work(x1+1+(pos-x2)+1,y1,pos+1,y2-1); } int main() { //freopen("in.txt","r",stdin); scanf("%s%s",pre,post); ans = 1; work(0,strlen(pre)-1,0,strlen(post)-1); printf("%d",ans);//这么奇怪的输出格式,换了行居然PE了 return 0; }