UVA

来源:互联网 发布:开通淘宝直播什么要求 编辑:程序博客网 时间:2024/06/06 02:15

思路

    直接枚举两列,然后枚举每一行用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;}

如有不当之处欢迎指出!