题意:给出一个m叉树的前序跟后序遍历,求出这个树有多少种形态
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int m;
string s1,s2;
bool vis[30];
int myc(int n,int r)
{
ll sum=1;
for(int i=1;i<=r;++i)
{
sum=sum*(n+1-i)/i;
}
return (int)sum;
}
int ans;
void dfs(int pre)
{
if(vis[s1[pre]-'a'])return;
vis[s1[pre]-'a']=1;
for(int i=0;i<s2.size();++i)
{
if(s2[i]==s1[pre])
{
int son=0;
for(int j=pre+1;j<s1.size();++j)
{
if(!vis[s1[j]-'a'])
{
int k;
for(k=0;k<s2.size();++k)
{
if(s1[j]==s2[k])break;
}
if(k<=i)
{
dfs(j);
son++;
}
}
}
if(son){
ans=ans*myc(m,son);
}
break;
}
}
return;
}
int main()
{
// freopen("data.txt","r",stdin);
while(cin>>m)
{
if(m==0)break;
cin>>s1>>s2;
memset(vis,false,sizeof(vis));
ans=1;
dfs(0);
printf("%d\n",ans);
}
return 0;
}