Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 2374 | Accepted: 1464 |
Description
a a a a / / \ \ b b b b / \ / \ c c c c
All of these trees have the same pre-order and post-order traversals. This phenomenon is not restricted to binary trees, but holds for general m-ary trees as well.
Input
m s1 s2
indicating that the trees are m-ary trees, s1 is the pre-order traversal and s2 is the post-order traversal.All traversal strings will consist of lowercase alphabetic characters. For all input instances, 1 <= m <= 20 and the length of s1 and s2 will be between 1 and 26 inclusive. If the length of s1 is k (which is the same as the length of s2, of course), the first k letters of the alphabet will be used in the strings. An input line of 0 will terminate the input.
Output
Sample Input
2 abc cba 2 abc bca 10 abc bca 13 abejkcfghid jkebfghicda 0
Sample Output
4 1 45207352860
这个题也比较简单,写的开心
#include <iostream> #include <cstring> #include <stdio.h> using namespace std; int m,sum; char s1[25],s2[25]; int fd(int lpre,int rpre,int lpost,int rpost) { if(lpre==rpre) return 1; int cou,nr[20],nl[20],i,j,k,ve,to; k=1; i=lpre+1; j=lpost; cou=0; nr[0]=j-1; nl[0]=i-1; while(i<=rpre) { char tem=s1[i]; //cout<<i<<endl; for(;j<=rpost-1;j++) { i++; if(tem==s2[j]) { cou++; nl[k]=i-1; nr[k]=j; k++; j++; //cout<<"sdsa"<<endl; break; } } } ve=1; for(i=0;i<cou;i++) ve=ve*(m-i)/(i+1); //cout<<cou<<endl<<ve<<endl; to=1; for(i=0;i<cou;i++){ //cout<<nl[i]+1<<"-"<<nl[i+1]<<endl; //cout<<nr[i]+1<<"-"<<nr[i+1]<<endl; to=to*fd(nl[i]+1,nl[i+1],nr[i]+1,nr[i+1]); } return to*ve; } int main() { cin>>m>>s1>>s2; int lpre,rpre,lpost,rpost,len; while(m!=0) { len=strlen(s1); lpre=0;rpre=len-1; lpost=0;rpost=len-1; cout<<fd(lpre,rpre,lpost,rpost)<<endl; cin>>m>>s1>>s2; } return 0; }