Database UVA - 1592
对于每组数据,首先通过一个map将每个字符串由一个数字代替,相同的字符串由相同数字代替,不同的字符串由不同数字代替。那么题目就变为了询问是否存在行r1,r2以及列c1,c2使得str[r1][c1]=str[r2][c1]且str[r1][c2]=str[r2][c2](此时所有单元格内都是数字,str[i][j]表示第i行第j列的数字)。也就是寻找两行和两列,它们相交所在的四个单元格中上面的两个与下面两个分别相等。
然后,由于行多列少,可以枚举列。对于每次枚举出的两列c1,c2,先清空map,然后从上往下扫描行。设当前扫描到的行是第k行,则建立二元组(str[k][c1],str[k][c2]),如果map中没有此二元组则将其放入map,并将值设为k;如果map中有此二元组,则表示前面有某行的c1,c2两列与这一行的c1,c2两列分别相同,那么由存入map的方法可知map[二元组]得到"某行",显然r1就是"某行",r2就是k,c1,c2就是枚举出的c1,c2。
#include<vector>
#include<map>
#include<string>
#include<iostream>
using namespace std;
int n,m;
int str[10001][11];
typedef pair<int,int> P;
int now;
map<string,int> IDcache;//根据字符串取ID
map<P,int> m2;//存储由二元组映射到行号
void getstring(string& s)
{
s="";
int a=getchar();
while(a=='\n') a=getchar();
while(a!='\n'&&a!=',')
{
s+=(char)a;
a=getchar();
}
}
int main()
{
string s1;
P p1;
int i,j,k;
bool flag;
while(cin>>n>>m)
{
flag=false;
now=0;
IDcache.clear();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
getstring(s1);
if(IDcache.count(s1)==1)
str[i][j]=IDcache[s1];
else
{
IDcache[s1]=(++now);
str[i][j]=now;
}
}
// for(i=1;i<=n;i++)
// for(j=1;j<=m;j++)
// cout<<str[i][j]<<'\n';
for(i=1;i<m;i++)
for(j=i+1;j<=m;j++)
{
m2.clear();
for(k=1;k<=n;k++)
{
//goto不应该乱用,但是跳出很多重循环可以用以简化程序
//https://baike.baidu.com/item/goto%E8%AF%AD%E5%8F%A5
p1=P(str[k][i],str[k][j]);
if(m2.count(p1)==1)
{
flag=true;
cout<<"NO\n";
cout<<m2[p1]<<' '<<k<<'\n';
cout<<i<<' '<<j<<'\n';
goto lab;
}
else
m2[p1]=k;
}
}
lab:
if(flag==false)
cout<<"YES\n";
}
return 0;
}
Database UVA - 1592的更多相关文章
- 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 ...
- 【例题5-9 UVA - 1592】Database
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举不同的列是哪两个列,然后枚举行. 把那一行的这两列的字符接在一起,然后用map判重. 为了防止逐个比较字符. 可以一开始先把字符 ...
- UVa 1592 Database (map)
题意:给出n行m列的数据库(数据范围: n 1~10000, m 1~10), 问你能不能找出两行r1, r2,使得这两行中的c1, c2列是一样的, 即(r1,c1)==(r2,c1) && ...
- UVa 1592 数据库(c++pair)
Input Input contains several datasets. The first line of each dataset contains two integer numbersn ...
- UVa第五章STL应用 习题((解题报告))具体!
例题5--9 数据库 Database UVa 1592 #include<iostream> #include<stdio.h> #include<string.h&g ...
随机推荐
- c# 连接各种数据库 Access、Server等
1.C#连接连接Access程序代码: using System.Data;using System.Data.OleDb;..string strConnection="Provider= ...
- 使用双引擎,让kbmmw 的客户端访问更方便(既给浏览器做服务,也给桌面程序做服务)
前面我们一直都讲了如何使用kbmmw smarthttpservice 给客户端提供REST 服务.主要都是返回给 浏览器访问的,如果我们使用delphi 开发桌面应用,如何使用这些服务呢?其实一切 ...
- 在C++中使用Libmd5计算字符串或文件的MD5值
CppMD5Demo.cpp #include <iostream> #include <fstream> #include <chrono> #include & ...
- TGraphiControl响应WM_MOUSEMOVE的过程(以TPaintBox为例)good
起因:非Windows句柄控件也可以处理鼠标消息,我想知道是怎么处理的:并且想知道处理消息的顺序(比如TPaintBox和TForm都响应WM_Mouse消息该怎么办)界面:把TPaintBox放到T ...
- 怎样在QML中利用Sprite来做我们须要的动画
在游戏中动画的设计很中要. 在QML中,它提供了丰富的animation.可是有时我们须要对图像进行变化,就像放电影一样.在今天的这篇文章中,我们将设计一个能够变化图像的动画. 我们能够通过Qt所提供 ...
- C++11 条件变量
C++11中的条件变量提供了用户等待的同步机制,在同步队列的应用中有很大的便利. 简单同步队列代码如下(SimpleSyncQueue.h): #ifndef SIMPLESYNCQUEUE_H #d ...
- JVM对象存活判断方法
一.GC主要针对什么区域 1. 程序计数器.虚拟机栈.本地方法栈,3个部分随线程而生死.每个栈桢分配多少内存基本上是在类结构确定下来时就已确定,大体上可认为是 编译期可知. 2. 而 堆 和 方法区 ...
- js中一些常见写法的含义
1. 常见格式:(function() { /* code */ })(); 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号 ...
- stringBuffer、StringBuilder、排序、Arrays、Jdk1.5新特性(java基础知识十三)
1.StringBuffer类的概述 * A:StringBuffer类概述 * 通过JDK提供的API,查看StringBuffer类的说明 * 1.线程安全的可变字符序列. * 2.可将字符串缓冲 ...
- 广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告
题目链接:http://poj.org/problem?id=3411 题目意思:N个city 由 m 条路连接,对于一条路(假设连接Cityia和 Cityb),如果从Citya 去 Cityb的途 ...