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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步