zoukankan      html  css  js  c++  java
  • C

    输入

    每个测试点(输入文件)有且仅有一组测试数据。

    每组测试数据的第1行为一个整数N,表示黑叔叔总共进行的操作次数。

    每组测试数据的第2~N+1行,每行分别描述黑叔叔的一次操作,其中第i+1行为一个整数op_i和两个由大小写字母组成的字符串Name1_i, Name2_i,其中op_i只可能为0或1,当op_i=0时,表示黑叔叔判定Name1_i和Name2_i是同一阵营的,当op_i=1时,表示黑叔叔希望知道Name1_i和Name2_i是否为同一阵营的。

    对于100%的数据,满足N<=10^5, 且数据中所有涉及的人物中不存在两个名字相同的人(即姓名唯一的确定了一个人),对于所有的i,满足Name1_i和Name2_i是不同的两个人。

    输出

    对于每组测试数据,对于黑叔叔每次op_i=1的操作,输出一行,表示查询的结果:如果根据已知信息(即这次操作之前的所有op_i=0的操作),可以判定询问中的两个人是同一阵营的,则输出yes,否则输出no。

    对于map,这类c++的东西一直都不太熟悉,之前AC这道题果断绕过了map,但是想想那样是不对的,所以又重新做了一遍。

    #include<stdio.h>
    #include<string.h>
    int par[100000];
    char c[100000][20];
    int cnt=0;
    
    int _find (int x)
    {
        if(par[x]==x)
        {
            return x;
        }
        else{
            return par[x]=_find(par[x]);
        }
    }
    void unite (int x,int y)
    {
        x=_find(x);
        y=_find(y);
        if(x!=y) par[x]=y;
    }
    int pp(char a[])
    {   int i;
        for( i=0;i<=cnt;i++)
        {
           if(strcmp(c[i],a)==0)
                 return par[i];
        }
        cnt++;
        strcpy(c[cnt],a);
        par[cnt]=cnt;
        return cnt;
    }
    int main()
    {
       char a[20],b[20];
       int T,n,i;
        int oo1,oo2;
        scanf("%d",&T);
          for( i=0;i<T;i++)
           {
               memset(a,0,sizeof(a));
               memset(b,0,sizeof(b));
               scanf("%d",&n);
               scanf("%s",a);
                 oo1=pp(a);
               scanf("%s",b);
                 oo2=pp(b);
               if(n==0)
               {
                unite(oo1,oo2);
               }
               else{
                if(_find(oo1)==_find(oo2))
                    printf("yes
    ");
                else
                    printf("no
    ");
               }
           }
        return 0;
    }

    map:

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    #include<map>
    int par[20005];
    
    void init()
    {
        for(int i=0; i<=20000; i++)
        {
            par[i]=i;
        }
    }
    int find (int x)
    {
        if(par[x]==x)
        {
            return x;
        }
        else
        {
            return par[x]=find(par[x]);
        }
    }
    void unite (int x,int y)
    {
        x=find(x);
        y=find(y);
        if(x!=y) par[x]=y;
    }
    
    int main()
    {
        init();
        int T;
        map<string,int > m;
        string ca,cb;
        int cnt = 0;
        int flag;
    
        scanf("%d",&T);
        while(T--)
        {
            cin >> flag >> ca >> cb;
            int ida;
            ida = m[ca];
            int idb;
            idb = m[cb];
            
            if( ida == 0 )
            {
                m[ca] = ++cnt;
                ida = m[ca];
            }
            if(idb == 0)
            {
                m[cb] = ++cnt;
                idb = m[cb];
            }
    
            if(flag == 0)
            {
                unite(ida,idb);
            }
            else
            {
                if(find(ida)==find(idb))
                    cout<<"yes"<<endl;
                else cout<<"no"<<endl;
            }
    
        }
        return 0;
    }
    


  • 相关阅读:
    SQL SERVER常用函数
    SQL SERVER系统表
    How do I implement a cancelable event?
    sql之left join、right join、inner join的区别
    inno setup脚本,涵盖了自定义安装界面,调用dll等等应用
    MS SQL SERVER 数据库日志压缩方法与代码
    SQLSERVER:计算数据库中各个表的数据量和每行记录所占用空间
    mysql记录执行的SQL语句
    powershell 激活WIN10
    jfinal undertow web.xml
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10160249.html
Copyright © 2011-2022 走看看