首页 > 学院 > 开发设计 > 正文

Database,Uva1592

2019-11-10 19:47:21
字体:
来源:转载
供稿:网友

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 ICPCPeterpeter@neerc.ifmo.ru
How to win ACM ICPCMichaelmichael@neerc.ifmo.ru
Notes from ACM ICPC championMichaelmichael@neerc.ifmo.ru

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 ( 1r1, r2n, r1r2), on the third line write two integer column numbers c1 and c2 ( 1c1, c2m, c1c2), so that values in columns c1and c2 are the same in rows r1 and r2.

 

Sample Input 

 

3 3How to compete in ACM ICPC,	Peter,		peter@neerc.ifmo.ruHow to win ACM ICPC,		Michael,	michael@neerc.ifmo.ruNotes from ACM ICPC champion,	Michael,	michael@neerc.ifmo.ru2 31,Peter,peter@neerc.ifmo.ru2,Michael,michael@neerc.ifmo.ru

 

Sample Output 

 

NO2 32 3YES

题意:存在两个不同行r1,r2和两个不同列c1,c2。是否存在r1,r2和从c1,c2使得(r1,c1)和(r2,c1)相同。

分析:

可以直接写一个四重循环枚举出r1,r2,c1,c2。理论上是可以的,但实际上却会TLE超时。

解决方法是只枚举c1,c2,然后从上往下扫描各行。每次碰到一个新的行r,就把对应c1,c2的内容作为一个二元组存到一个map里,然后如果map的键值已经存在这个二元组,该二元组映射到的就是所要求的r1,而当前行就是r2。

细节问题:如何表示由c1,c2两列组成的二元组?一种方法是直接用两个字符串拼成一个长字符串(中间用一个其他地方不可能出现的字符分隔),但是速度比较慢,(因为在map中查找元素时需要进行字符串比较操作)。

更值得推荐的方法是在主循环之前先做一个预处理—给所有字符串分配一个编号,则整个数据库中每个单元格都变成了整数,上述二元组就变成了两个整数。

思路:1.首先将每一个表格里面的字符串用map进行编号处理2.一行一行的扫描,每两列的编号作为一个二元组存入map中,若已经存在该编号则说明有满足条件的,需要输出。复制代码
#include <iostream>#include <string>#include <set>#include <vector>#include <map>using namespace std;const int ROW = 10000 + 10;const int COL = 10 + 5;int n,m;int s[ROW][COL];map<string, int> IDcache;struct node{    int x,y;    node(int x, int y):x(x),y(y) { }    bool Operator < (const node& r) const { return x<r.x || x==r.x&&y<r.y; }};map<node,int> data;int main(){    int n,m;    int ID=1;    cin>>n>>m;    string x;    for(int i=0;i<n;i++){        for(int j=0;j<m;j++){             cin>>x;             if(!IDcache.count(x)){                 IDcache[x]=ID;                 s[i][j]=ID;                 ID++;             }             else{                s[i][j]=IDcache[x];             }        }    }    int flag=0;        for(int c1=0;c1<m;c1++){        for(int c2=c1+1;c2<m;c2++){                data.clear();                for(int r=0;r<n;r++){                    int x = s[r][c1];                    int y = s[r][c2];                    node p(x,y);                    if(!data.count(p)){                        data[p]=r;                    }                    else                    {                        flag=1;                        cout<<"NO"<<endl;                        cout<<data[p]+1<<" "<<r+1<<endl<<c1+1<<" "<<c2+1<<endl;                    }                }        }    }    if(flag==0)    {      cout<<"YES";    }    cout<data++<<endl;        return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表