L2-030 冰岛人 (25 分)

题目保证不存在两个人是同名的。

找最近公共祖先使用向上标记法。

const int N=10010;
unordered_map<string,string> fa;
unordered_map<string,bool> sex;
int n,m;

bool check(string a,string b)
{
    unordered_map<string,int> vis;
    for(int i=1;a != "";i++)
    {
        vis[a]=i;
        a=fa[a];
    }

    for(int i=1;b != "";i++)
    {
        if(vis[b]) return vis[b] >= 5 && i >= 5;  // 两人的公共祖先必须比任何一方的曾祖父辈分高
        b=fa[b];
    }
    return true;  // vis[b]的值均为0, 说明两人不存在公共祖先, 
}

int main()
{
    cin>>n;

    for(int i=0;i<n;i++)
    {
        string fname,lname;
        cin>>fname>>lname;
        if(lname.back() == 'm') sex[fname]=true;
        else if(lname.back() == 'f') sex[fname]=false;
        else if(lname.substr(lname.size()-4) == "sson")
        {
            sex[fname]=true;
            fa[fname]=lname.substr(0,lname.size()-4);
        }
        else
        {
            sex[fname]=false;
            fa[fname]=lname.substr(0,lname.size()-7);
        }
    }

    cin>>m;
    while(m--)
    {
        string a,b,c,d;
        cin>>a>>b>>c>>d;
        if(sex.count(a) == 0 || sex.count(c) == 0)
            puts("NA");
        else if(sex[a] == sex[c])
            puts("Whatever");
        else if(check(a,c))
            puts("Yes");
        else
            puts("No");
    }
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14691811.html