UVA 1592 DataBase

思路:

知识补充:

①make_pair和pair:

/*pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,
如stl中的map就是将key和value放在一起来保存。
另一个应用是,当一个函数需要返回2个数据的时候,
可以选择pair。 pair的实现是一个结构体,
主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。

2 make_pair函数

template pair make_pair(T1 a, T2 b) { return pair(a, b); }

很明显,我们可以使用pair的构造函数也可以使用make_pair来生成我们需要的pair。*/

②string的find函数:

/*string查找函数,都有唯一的返回类型,那就是size_type,
        即一个无符号整数(按打印出来的算)。
        若查找成功,返回按查找规则找到的第一个字符或子串的位置;
        若查找失败,返回npos,即-1(打印出来为4294967295)。
        s.find(a,pos)从pos开始查找a
        */

③string的substr函数:

s.substr(startPos,len);从startPos开始,截取长度为len的子串。

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<string>
 5 #include<map>
 6 #include<sstream>
 7 using namespace std;
 8 
 9 typedef pair<int,int> PII;
10 /*pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,
11 如stl中的map就是将key和value放在一起来保存。
12 另一个应用是,当一个函数需要返回2个数据的时候,
13 可以选择pair。 pair的实现是一个结构体,
14 主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。
15 
16 2 make_pair函数
17 
18 template pair make_pair(T1 a, T2 b) { return pair(a, b); }
19 
20 很明显,我们可以使用pair的构造函数也可以使用make_pair来生成我们需要的pair。*/
21 const int maxr = 10000 + 5;
22 const int maxc = 10 + 5;
23 
24 int m, n, db[maxr][maxc], cnt;
25 
26 map<string, int> id;
27 int ID(const string& s) {
28   if(!id.count(s)) {
29     id[s] = ++cnt;
30   }
31   return id[s];
32 }
33 
34 void find() {
35   for(int c1 = 0; c1 < m; c1++)
36     for(int c2 = c1+1; c2 < m; c2++) {
37       map<PII, int> d;
38       for(int i = 0; i < n; i++) {
39         PII p = make_pair(db[i][c1], db[i][c2]);
40         if(d.count(p)) {
41           printf("NO\n");
42           printf("%d %d\n", d[p]+1, i+1);//输出行
43           printf("%d %d\n", c1+1, c2+1);//输出列
44           return;
45         }
46         d[p] = i;
47       }
48     }
49   printf("YES\n");
50 }
51 
52 
53 int main() {
54   string s;
55   while(getline(cin, s)) {
56     stringstream ss(s);
57     if(!(ss >> n >> m)) break;
58     cnt = 0;
59     id.clear();
60     for(int i = 0; i < n; i++) {
61       getline(cin, s);
62       int lastpos = -1;
63       for(int j = 0; j < m; j++) {
64         int p = s.find(',', lastpos+1);
65         /*string查找函数,都有唯一的返回类型,那就是size_type,
66         即一个无符号整数(按打印出来的算)。
67         若查找成功,返回按查找规则找到的第一个字符或子串的位置;
68         若查找失败,返回npos,即-1(打印出来为4294967295)。
69         s.find(a,pos)从pos开始查找a
70         */
71         if(p == string::npos) p = s.length();
72         db[i][j] = ID(s.substr(lastpos+1, p - lastpos - 1));
73         /*
74         s.substr(startPos,len);
75         */
76         lastpos = p;
77       }
78     }
79     find();
80   }
81   return 0;
82 }

 

posted @ 2019-02-10 21:16  付玬熙  阅读(115)  评论(0编辑  收藏  举报