zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    C# 正则表达式
    C# 预处理命令
    C# System.Collections
    C#文件流 System.IO和对文件的读写操作
    c# 网站发布
    C# 数据库
    c# 数据存储过程 存储函数
    insert 插入
    SVN远程管理
    【Win】印象笔记快捷键
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14691811.html
Copyright © 2011-2022 走看看