前后序遍历之所以会产生多种结果,关键在于前后序遍历中,左子树和右子树(或者说左节点和右节点)在遍历顺序上是相邻的,不像中序遍历那样有根节点可以加以区分。而问题就出现在,若果当前节点是单子树的,在前后序遍历上就无法区分它究竟是左子树还是右子树。若这种情况出现了n次,那么结果就有2的n次方个可能。所以,解决这个问题的关键就转移到了寻找单子树节点的个数上。
通过简单的构图,可以发现对于单子树的存在,根节点和子树节点在前后序遍历上是相邻的,而出现的顺序是相反的。通过这个规律就可以找到这种特殊存在的个数。
另:这道题有个很坑人的地方,就是输出不要换行……
Run Time: 0sec
Run Memory: 312KB
Code length: 417Bytes
SubmitTime: 2011-12-29 17:22:52
// Problem#: 1210
// Submission#: 1151030
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i, j;
int size, ans;
string s1, s2;
cin >> s1 >> s2;
size = s1.size();
s1 = " " + s1;
s2 = " " + s2;
ans = 1;
for ( i = 1; i < size; i++ ) {
if ( s1[ i + 1 ] == s2[ s2.find( s1[ i ] ) - 1 ] )
ans *= 2;
}
cout << ans;
return 0;
}