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了!

瞎想:为什么不用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 G[10001][11];
int num = 0;
int Getid(string s)
{
    if(M.count(s)) return M[s];
    return M[s] = num++;
}
int main(void)
{
    int n, m;
    while(scanf("%d%d", &n, &m)==2){
        getchar();
        M.clear();
        num = 0;
        sqare.clear();
        int j = 0;
        for(int i=0;i<n;i++){
            j = 0;
            string tmp;
            getline(cin, tmp);
            for(int k=0; 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("");
//        }
        int index = -1, i, k;
        for(j=0; j<m-1; j++){//注意枚举的顺序!我一开始就盖了个0~n的傻逼循环
            for(k=j+1; k<m; k++){
                sqare.clear();//注意clear(),因为这个位置的二元组已经枚举完了,没有       我们想要的!
                for(i=0; 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;
                }
                if(index!=-1) break;
            }
            if(index!=-1) break;
        }
        if(index==-1) puts("YES");
        else{
            puts("NO");
            printf("%d %d\n", index+1, i+1);
            printf("%d %d\n", j+1, k+1);
        }
    }
    return 0;
}     

时间: 2024-10-23 02:39:24

UVa 1592 Database (map)的相关文章

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行. 其实这种方法很

UVA 12096 STL map set 的使用

set这个容器也是STL库的一员,并且在algorithm内直接有 set_union set_intersection  这样求并集交集的操作 map 最方便的地方就是 支持下标访问 举例说明 : 1 #include<iostream> 2 include<cstdio> 3 #include<cstring> 4 #include<vector> 5 #include<map> 6 #include<set> 7 #includ

【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

UVa 1592模拟(map)

背景:第一因为找到结果之后没有及时的停止查找而wa了一发,改正后ac. 思路:首先对读入的每一个string,设置一个独特的ID,这样就把string变为int,后来比较的时候就会简化很多,设置ID的时候用map来赋予每一种string对应一个独特的ID.然后构建一个key为pair<int,int>的map,因为行比较多列比较少(列的数为10),就枚举列的所有组合,然后对每组组合来进行map判重. 我的代码: #include <set> #include <stack&g

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

UVa 1592 数据库(c++pair)

Input Input contains several datasets. The first line of each dataset contains two integer numbersn and m (1n10000, 1m10), the number of rows and columns in the table. The following n lines contain table rows. Each row hasm column values separated by

uva 11991 (map vector 嵌套)

其实这题可以直接用vector #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<map> #include<vector> using namespace std; vector<int> str[1000000+100]; int main() { int n,m; int i,j,k; int que,

uva 156 (map)

暑假培训习题 1.用vector<string>储存string类型的输入单词: 2.将vector中的元素逐一标准化后映射进map中,并给map值加一: 3.新建一个空的vector 4.标准化之前的vector中的元素,并查看map中的值,如果是一,则把这个元素压入新的vector中,给新的vector排序并输出: #include<stdio.h>#include<map>#include<string>#include<algorithm>