▲数据结构 【2012】四4 C++版

 

#include<iostream>
#include<string>
using namespace std;
int lefts[20],rights[20],father[20];
string s1,s2,s3;
int n,ans;

void calc(int x,int dep)
{
    ans+=dep*(s1[x]-'A'+1);
    if(lefts[x]>=0) calc(lefts[x],dep+1);
    if(rights[x]>=0) calc(rights[x],dep+1);
}

void check(int x)
{
    if(lefts[x]>=0) check(lefts[x]);
    s3=s3+s1[x];
    if(rights[x]>=0) check(rights[x]);
}

void dfs(int x,int th)
{
    if(th==n)
    {
        s3="";
        check(0);
        if(s3==s2)
        {
            ans=0;
            calc(0,1);
            cout<<ans<<endl;
        }
        return;
    }
    if(lefts[x]==-1&& rights[x]==-1)
    {
        lefts[x]=th;
        father[th]=x;
        dfs(th,th+1);
        father[th]=-1;
        lefts[x]=-1;
    }
    if(rights[x]==-1)
    {
        rights[x]=th;
        father[th]=x;
        dfs(th,th+1);
        father[th]=-1;
        rights[x]=-1;
    }
    if(father[x]>=0)
        dfs(father[x],th);
}

int main(){
    int i,j;
    cin>>s1;
    cin>>s2;
    n=s1.size();
    memset(lefts,-1,sizeof(lefts));
    memset(rights,-1,sizeof(rights));
    memset(father,-1,sizeof(father));
    dfs(0,1);
    return 0;
}

  

posted @ 2016-10-07 15:47  qilinart  阅读(149)  评论(0)    收藏  举报