您的位置:首页 > 其它

UVA - 1592 Database 枚举+map

2017-08-24 09:23 393 查看

思路

直接枚举两列,然后枚举每一行用map依次记录每对字符串出现的是否出现过(字符串最好先处理成数字,这样会更快),如果出现就是”NO”,否则就是”YES”。

AC代码

#include <stdio.h>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
typedef pair<int, int> pii;
const int maxr = 10000+5;
const int maxc = 15;
int tab[maxr][maxc];
map<string, int> idMap;
int id;
map<pii, int> visMap;

void init() {
id = 0;
idMap.clear();
visMap.clear();
}

int getId(string s) {
if(!idMap.count(s)) {
idMap[s] = id++;
}
return idMap[s];
}

void solve(int r, int c) {
for(int i = 0; i < c; i++) {
for(int j = i+1; j < c; j++) {
visMap.clear();
for(int k = 0; k < r; k++) {
pii p = make_pair(tab[k][i], tab[k][j]);
if(visMap.count(p)) {
printf("NO\n");
printf("%d %d\n", visMap[p], k+1);
printf("%d %d\n", i+1, j+1);
return;
} else {
visMap[p] = k+1;
}
}
}
}
printf("YES\n");
}

int main() {
int r, c;
string x;
while(scanf("%d%d", &r, &c) == 2) {
init();
getchar();
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
char ch;
x = "";
while(scanf("%c", &ch)==1 && ch != '\n' && ch != ',') {
x += ch;
}
tab[i][j] = getId(x);
//printf("%d ", tab[i][j]);
}
//printf("\n");
}
solve(r, c);
}
return 0;
}


如有不当之处欢迎指出!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: