UVa 1592 Database (map)
题意:给出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)的更多相关文章
- UVa 1592 Database(巧用map)
Peter studies the theory of relational databases. Table in the relational database consists of value ...
- UVA - 1592 Database 枚举+map
思路 直接枚举两列,然后枚举每一行用map依次记录每对字符串出现的是否出现过(字符串最好先处理成数字,这样会更快),如果出现就是"NO",否则就是"YES". ...
- UVA 1592 DataBase
思路: 知识补充: ①make_pair和pair: /*pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存.另一个应用 ...
- UVa - 1592 Database(STL,优化)
给一个n行m列的数据库表格,问有没有两个行 r1,r2 和 c1,c2,满足(r1,r2)的元素=(c1,c2)的元素. n≤10000,m≤10. 直接枚举4个肯定会T的.可以只枚举c1 c2,然后 ...
- 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 ...
- Database UVA - 1592
对于每组数据,首先通过一个map将每个字符串由一个数字代替,相同的字符串由相同数字代替,不同的字符串由不同数字代替.那么题目就变为了询问是否存在行r1,r2以及列c1,c2使得str[r1][c1]= ...
- 【例题5-9 UVA - 1592】Database
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举不同的列是哪两个列,然后枚举行. 把那一行的这两列的字符接在一起,然后用map判重. 为了防止逐个比较字符. 可以一开始先把字符 ...
- UVA 156 Ananagrams ---map
题目链接 题意:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词.在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典序进行排列( ...
- UVa 1592 数据库(c++pair)
Input Input contains several datasets. The first line of each dataset contains two integer numbersn ...
随机推荐
- Java中创建的对象多了,必然影响内存和性能
1, Java中创建的对象多了,必然影响内存和性能,所以对象的创建越少越好,最后还要记得销毁.
- 爬虫实例学习——爬取酷狗TOP500数据
酷狗网址:https://www.kugou.com/yy/rank/home/1-8888.html?from=rank 环境:eclipse+pydev import requests from ...
- spark教程(11)-sparkSQL 数据抽象
数据抽象 sparkSQL 的数据抽象是 DataFrame,df 相当于表格,它的每一行是一条信息,形成了一个 Row Row 它是 sparkSQL 的一个抽象,用于表示一行数据,从表现形式上看, ...
- Ansible 常用模块详解
经过前面的介绍,我们已经熟悉了 Ansible 的一些常识性的东西和如何编译安装Ansible,从本章开始我们将全面介绍 Ansible 的各种生产常用模块,这些也是我们使用 Ansible 的过程中 ...
- command----常用命令更新ing
common commands 1:split---拆分文件 [root@localhost split]# split -b 1M split.tar.gz split_ #按1M拆分文件 [roo ...
- jsp页面中使用 splitfn:split注意事项
我们有一个 字段存储内容是 xxxx意见~~@~~是 在页面上需要分开显示,格式为 xxx意见 是 使用 ${fn:split(comments, '~~@~~')[1]} 来分割是发现出现@符文字 ...
- Nginx之常用操作
1) 将XXX.com 重定向到 www.XXX.com server { client_max_body_size 20m; listen ; server_name www.xxx.com xxx ...
- 94. Binary Tree Inorder Traversal (Java)
Given a binary tree, return the inorder traversal of its nodes' values. Example: Input: [1,null,2,3] ...
- LVS Director端服务启动脚本
#!/bin/bash # 手动安装lpvs前端管理工具 # chkconfig: - # # lvs启动脚本:director # lvs模式类型:nat.dr.ipip # lvs代理协议:tcp ...
- 第一篇、Python入门
一 编程与编程语言 python是一门编程语言,作为学习python的开始,需要事先搞明白:编程的目的是什么?什么是编程语言?什么是编程? 编程的目的: #计算机的发明,是为了用机器取代/解放人力,而 ...