给一个n行m列的数据库表格,问有没有两个行 r1,r2 和 c1,c2,满足(r1,r2)的元素=(c1,c2)的元素。
n≤10000,m≤10。
直接枚举4个肯定会T的。可以只枚举c1 c2,然后枚举每一行,将c1 c2加入map里,下面再次枚举到就证明有。
pair是个很好用的东西。
#include <iostream> #include <cstdio> #include <string> #include <vector> #include <map> using namespace std; #define maxn 10000 + 100 int main() { int n, m; while(scanf("%d%d", &n, &m) != EOF) { getchar(); vector<string> a[maxn]; string s; for (int i = 1; i <= n; i++) { getline(cin, s); int len = s.size(); string k = ""; for (int j = 0; j < len; j++) if (s[j] == ',') { a[i].push_back(k); k = ""; } else k += s[j]; a[i].push_back(k); } int canfind = 0; int r1, r2, c1, c2; for (int k = 0; k < m; k++) for (int j = k+1; j < m; j++) { map<pair<string, string>, int> ss; for (int i = 1; i <= n; i++) { pair<string, string> t(a[i][k], a[i][j]);//pair的构造函数 if (ss.count(t)) { canfind = 1; r1 = ss[t], r2 = i; c1 = k+1, c2 = j+1; break; } else ss[t] = i; } if (canfind) break; } if (canfind) { printf("NO "); printf("%d %d ", r1, r2); printf("%d %d ", c1, c2); } else { printf("YES "); } } }