1592 - Database

Peter studies the theory of relational databases. Table in the relational database consists of values that are arranged in rows and columns.

There are different normal forms that database may adhere to. Normal forms are designed to minimize the redundancy of data in the database. For example, a database table for a library might have a row for each book and columns for book name, book author, and author‘s email.

If the same author wrote several books, then this representation is clearly redundant. To formally define this kind of redundancy Peter has introduced his own normal form. A table is in Peter‘s Normal Form (PNF) if and only if there is no pair of rows and a pair of columns such that the values in the corresponding columns are the same for both rows.

How to compete in ACM ICPC Peter [email protected]
How to win ACM ICPC Michael [email protected]
Notes from ACM ICPC champion Michael [email protected]

The above table is clearly not in PNF, since values for 2rd and 3rd columns repeat in 2nd and 3rd rows. However, if we introduce unique author identifier and split this table into two tables -- one containing book name and author id, and the other containing book id, author name, and author email, then both resulting tables will be in PNF.

Given a table your task is to figure out whether it is in PNF or not.

Input

Input contains several datasets. The first line of each dataset contains two integer numbers n and m ( 1n10000, 1m10), the number of rows and columns in the table. The following n lines contain table rows. Each row has m column values separated by commas. Column values consist of ASCII characters from space (ASCII code 32) to tilde (ASCII code 126) with the exception of comma (ASCII code 44). Values are not empty and have no leading and trailing spaces. Each row has at most 80 characters (including separating commas).

Output

For each dataset, if the table is in PNF write to the output file a single word ``YES" (without quotes). If the table is not in PNF, then write three lines. On the first line write a single word ``NO" (without quotes). On the second line write two integer row numbers r1 and r2 ( 1r1r2nr1r2), on the third line write two integer column numbers c1 and c2 ( 1c1c2mc1c2), so that values in columns c1and c2 are the same in rows r1 and r2.

Sample Input

3 3
How to compete in ACM ICPC,Peter,[email protected]
How to win ACM ICPC,Michael,[email protected]
Notes from ACM ICPC champion,Michael,[email protected]
2 3
1,Peter,[email protected]
2,Michael,[email protected]

Sample Output

NO
2 3
2 3
YES

学到了好多东西,虽然不是通过这个题学的,pair<size_t,size_t>,make_pair(),用map给集合编号

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <map>
 5 #include <set>
 6 #include <vector>
 7
 8 using namespace std;
 9
10 map<string,int>ID;
11 map<pair<int,int>,int> IDrow;
12
13 int a[10010][11];
14 int t;
15
16 void Clear() {
17     ID.clear();
18     IDrow.clear();
19     t = 1;
20     memset(a,0,sizeof(a));
21 }
22
23 int main () {
24     int n,m;
25     while (cin >> n >> m) {
26         getchar();
27         Clear();
28         string str;
29         int col = 0;
30         for (int i = 0;i < n;i++) {
31             getline(cin,str);
32             string x;
33             col = 0;
34             for (int j = 0,len = str.length();j < len;j++) {
35                 if (str[j] != ‘,‘) x += str[j];
36                 if (str[j] == ‘,‘ || j == len - 1) {
37                     if (ID.count(x) == 0) {
38                         ID[x] = t++;
39                     }
40                     a[i][col++] = ID[x];
41                     x.clear();
42                 }
43             }
44         }
45         for (int j = 0;j < col - 1;j++) {
46             for (int k = j + 1;k < col;k++) {
47                 for (int i = 0;i < n;i++) {
48                     int x = a[i][j],y = a[i][k];
49                     if (IDrow.count(make_pair(x,y))) {
50                         cout << "NO" << endl;
51                         cout << IDrow[make_pair(x,y)] <<" " << i + 1<< endl;
52                         cout << j + 1 << " " << k + 1 << endl;
53                         goto END;
54                     }
55                     else IDrow[make_pair(x,y)] = i + 1;
56                 }
57                 IDrow.clear();
58             }
59         }
60         cout << "YES" << endl;
61         END:{}
62     }
63 }

时间: 2024-10-24 14:26:40

1592 - Database的相关文章

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的键值设置为一个pai

UVa - 1592 Database(STL综合,强推!)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51293 #include <iostream> #include <map> #include <vector> #include <string> #include <cstdio> #include <cstring> #define MAXN 10005 #define MAXM 15 using

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 123,654,789 (1,3) 就对应(3,3) 如果有这种对应,就输出NO,然后输出两个行号, 两个列号.否则输出YES. 分析: 将每个字符串映射成一个值. 枚举任意两列,构成一对pair,枚举任意两行是否相等,任意两列组合C(10,2) = 45种 行最多有10000行. 其实这种方法很

将一个php的一个查询代码改成go语言

一个朋友的网站用php开发的,总是感觉慢. 我将其中的查询sql server 代码改成go语言 (有7000多条记录) 都能感觉到速度比以前快多了. 努力继续学go语言吧. php没有使用任何框架. package main import ( _ "github.com/lunny/godbc" "github.com/go-xorm/xorm" "net/http" "fmt" ) func testweb(w http.

【UVa 1592】Database

Peter studies the theory of relational databases. Table in the relational database consists of values that are arranged in rows and columns. There are different normal forms that database may adhere to. Normal forms are designed to minimize the redun

oracle database resident connection pooling(驻留连接池)

oracle在11g中引入了database resident connection pooling(DRCP).在此之前,我们可以使用dedicated 或者share 方式来链接数据库,dedicated方式是oracle数据库默认的链接方式,无需过多的配置,而且关于dedicated的bug也是非常少的,因此,通常情况下,建议使用dedicated方式来链接数据库.但是,在服务器资源有限,并且同时连接数据库的用户量非常大时,dedicated方式就无能为力了.假设并发用户为5000,每个d

Oracle Database 12c Release 1下载安装(自身经历)

1.访问Oracle官网:https://www.oracle.com/index.html,下载Oracle Database 12c Release 1 (注意:File1和File2都要下载!!不然后期安装会报一堆错误,可参考:http://www.2cto.com/database/201503/386272.html) 2.将文件解压,把winx64_12102_database_2of2文件夹中database\stage\components目录下的所有文件夹,复制到winx64_

The SQL Server Service Broker for the current database is not enabled

把一个数据恢复至另一个服务器上,出现了一个异常: The SQL Server Service Broker for the current database is not enabled, and as a result query notifications are not supported.  Please enable the Service Broker for this database if you wish to use notifications. 截图如下: 解决方法: 参

Mac&#160;下locate命令使用问题WARNING: The locate database (/var/db/locate.database) does not exist.

想在Mac下使用locate时,提醒数据库没创建: WARNING: The locate database (/var/db/locate.database) does not exist. To create the database, run the following command: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist Please be aware that the d