题意:给出n行m列的数据库(数据范围: n 1~10000, m 1~10), 问你能不能找出两行r1, r2,使得这两行中的c1, c2列是一样的, 即(r1,c1)==(r2,c1) && (r1,c2)==(r2,c2), 可以的话输出NO并且输出r1, r2, c1, c2, 否则输出YES!

分析:如果是四个for循环去枚举全部的r1,r2,c1,c2复杂度是O(n*n*m*m),肯定超时!能否减少枚举量?或者只是枚举行或者列?这里可以使用map做到!map的键值设置为一个pair<int, int>存储每一行c1,c2, 第二个值设置为此二元组所在的行, 即map<pair<int,int>,int> == map( <c1, c2>, row ), 这样只要枚举每一行的二元组,然后一行行枚举下去,如果有重复出现的,比如这时候枚举到第i行,然后有其中一个二元组(c1, c2)重复出现,那map[make_pair(c1, c2)]就是之前第一次出现此二元组的行数,第二次出现的行数便是i了!其中可以使用map当类似哈希效果的作用,即将string转化成int, 提取字符串也可以用到stringstream类来进行, 不过这里要注意如果需要有一些空格需要保留(即关键字里面本来就有空格字符),解决方法就是将其填充为一个不可能的字符呀!然后将' , '变成'   '就OK了!即将' , '作为断点分割字符串, 具体可以查查stringstream的用法, 很强大, 但是很慢, 需要谨慎使用!

瞎想:为什么不用set?因为不能知道第一次出现二元组的行数呀!

能不能行列颠倒来枚举?不可以!

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<set>
#include<map>
#include<sstream>
#include<math.h>
using namespace std;
map<pair<int, int>, int> sqare;
map<string, int> M;
][];
;
int Getid(string s)
{
    if(M.count(s)) return M[s];
    return M[s] = num++;
}
int main(void)
{
    int n, m;
    ){
        getchar();
        M.clear();
        num = ;
        sqare.clear();
        ;
        ;i<n;i++){
            j = ;
            string tmp;
            getline(cin, tmp);
            ; k<tmp.length(); k++){
                if(tmp[k]==',') tmp[k] = ' ';
                else if(tmp[k]==' ') tmp[k] = '}';
            }
            stringstream s;
            s<<tmp;
            string temp;
            while(s>>temp){
                G[i][j++] = Getid(temp);
            }
        }
//        for(int ii=0; ii<n; ii++){
//            for(int jj=0; jj<m; jj++){
//                printf("%d ", G[ii][jj]);
//            }
//            puts("");
//        }
        , i, k;
        ; j<m-; j++){//注意枚举的顺序!我一开始就盖了个0~n的傻逼循环
            ; k<m; k++){
                sqare.clear();//注意clear(),因为这个位置的二元组已经枚举完了,没有       我们想要的!
                ; i<n; i++){
                    if(sqare.count(make_pair(G[i][j], G[i][k]))){
                        index = sqare[make_pair(G[i][j], G[i][k])];
                        break;
                    }
                    sqare[make_pair(G[i][j], G[i][k])] = i;
                }
                ) break;
            }
            ) break;
        }
        ) puts("YES");
        else{
            puts("NO");
            printf(, i+);
            printf(, k+);
        }
    }
    ;
}     

UVa 1592 Database (map)的更多相关文章

  1. UVa 1592 Database(巧用map)

    Peter studies the theory of relational databases. Table in the relational database consists of value ...

  2. UVA - 1592 Database 枚举+map

    思路 直接枚举两列,然后枚举每一行用map依次记录每对字符串出现的是否出现过(字符串最好先处理成数字,这样会更快),如果出现就是"NO",否则就是"YES". ...

  3. UVA 1592 DataBase

    思路: 知识补充: ①make_pair和pair: /*pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存.另一个应用 ...

  4. UVa - 1592 Database(STL,优化)

    给一个n行m列的数据库表格,问有没有两个行 r1,r2 和 c1,c2,满足(r1,r2)的元素=(c1,c2)的元素. n≤10000,m≤10. 直接枚举4个肯定会T的.可以只枚举c1 c2,然后 ...

  5. uva 1592 Database (STL)

    题意: 给出n行m列共n*m个字符串,问有没有在不同行r1,r2,有不同列c1,c2相同.即(r1,c1) = (r2,c1);(r1,c2) = (r2,c2); 如 2 3 123,456,789 ...

  6. Database UVA - 1592

    对于每组数据,首先通过一个map将每个字符串由一个数字代替,相同的字符串由相同数字代替,不同的字符串由不同数字代替.那么题目就变为了询问是否存在行r1,r2以及列c1,c2使得str[r1][c1]= ...

  7. 【例题5-9 UVA - 1592】Database

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举不同的列是哪两个列,然后枚举行. 把那一行的这两列的字符接在一起,然后用map判重. 为了防止逐个比较字符. 可以一开始先把字符 ...

  8. UVA 156 Ananagrams ---map

    题目链接 题意:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词.在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典序进行排列( ...

  9. UVa 1592 数据库(c++pair)

    Input Input contains several datasets. The first line of each dataset contains two integer numbersn  ...

随机推荐

  1. [c++] 计算太阳高度角

    /* 输入参数: Longitude - 经度(单位"度") Latitude - 纬度(单位"度") Year - 年 Month - 月 Day - 日 H ...

  2. mysql 错误号码1129

    SQLyog连接mysql 错误号码1129: mysql error 1129: Host 'bio.chip.org' is blocked because of many connection ...

  3. CF171C 【A Piece of Cake】

    遵从题意枚举暴力读人n,再求出$\sum^n_1a[i]*i$然后输出答案,(记得开个long long以免炸掉)以下是代码: #include<bits/stdc++.h> using ...

  4. Windows 系统安装 Docker

    详细方法参见官方文档. Win10 家庭版 安装Toolbox Win10 家庭版由于功能限制,不能直接安装 Docker for Windows, 需要使用 Toolbox 的形式进行安装. 确认版 ...

  5. python_0基础开始_day08

    第八节 1,文件操作 文件操作目的: 持久化,永久存储 (数据库之前 -- 文件操作就是代替数据库) 读 1,找到文件位 2,双击打开 3,进行一些操作 4,关闭文件 open() 打开,通过pyth ...

  6. Docker简易使用手册

    1. Docker介绍 Docker中文社区文档 Docker 是一个开源的软件部署解决方案. Docker 包括三个基本概念: 镜像(Image) Docker的镜像概念类似于虚拟机里的镜像,是一个 ...

  7. 禁止ios10双指缩放

    document.addEventListener('gesturestart', function(event) { event.preventDefault(); });

  8. jQuery 遍历 - 祖先

    通过 jQuery,您能够向上遍历 DOM 树,以查找元素的祖先. 向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() parents() pare ...

  9. OpenSSL(2)创建私有证书颁发机构

    如果想要建立自己的CA, OpenSSL已经包含了所有你需要的东西.所有的操作都通过纯命令行执行,虽然不那么友好,整个过程也比较长,但是这可以让你去思考每个细节. 我建议自己创建一套私有的 CA主要是 ...

  10. laravel相关备忘

    此次笔记采用的是laravel5.1版本 1.从gitcheckout下来后,首先在env修改数据库相关 2.默认laravel没有model目录,默认有一个model文件User.php放在app里 ...