Database UVA - 1592

本文提供了一种解决UVA-1592问题的方法,通过使用字符串映射和双层循环来判断数据是否存在冲突,并给出了具体的C++实现代码。

https://cn.vjudge.net/problem/UVA-1592

 

#include<bits/stdc++.h>

using namespace std;

typedef pair<int,int> PII;

 

const int maxr = 10000 + 5;

const int maxc = 10 + 5;

 

int n,m,cnt,id[maxr][maxc];

map<string,int> IDcache;

 

int ID(const string & s){

    if(IDcache.count(s))return IDcache[s];

    return IDcache[s]=++cnt;

}

 

void findAns(){

    for(int c1=0;c1<m;c1++)

        for(int c2=c1+1;c2<m;c2++){

            map<PII,int> d;

            for(int i=0;i<n;i++){

                PII p=make_pair(id[i][c1],id[i][c2]);

                if(d.count(p)){

                    puts("NO");

                    printf("%d %d\n",d[p]+1,i+1);

                    printf("%d %d\n",c1+1,c2+1);

                    return;

                }

                d[p]=i;

            }

    }

    puts("YES");

}

 

int main() {

    //freopen("datain.txt","r",stdin);

    while(cin>>n>>m){

        getchar(); cnt=0;

        IDcache.clear();

        string s;

        for(int i=0;i<n;i++){

            getline(cin,s);

            int lastpos=0;

            for(int j=0;j<m;j++){

                int p=s.find(',',lastpos);

                id[i][j]=ID(s.substr(lastpos,p-lastpos));

                lastpos=p+1;

            }

        }

        findAns();

    }

}

#include<bits/stdc++.h>usingnamespacestd; typedef pair<int,int> PII; constint maxr = 10000 + 5; constint maxc = 10 + 5; int n,m,cnt,id[maxr][maxc]; map<string,int> IDcache; int ID(const string & s){ if(IDcache.count(s))return IDcache[s]; return IDcache[s]=++cnt; } void findAns(){ for(int c1=0;c1<m;c1++) for(int c2=c1+1;c2<m;c2++){ map<PII,int> d; for(int i=0;i<n;i++){ PII p=make_pair(id[i][c1],id[i][c2]); if(d.count(p)){ puts("NO"); printf("%d %d\n",d[p]+1,i+1); printf("%d %d\n",c1+1,c2+1); return; } d[p]=i; } } puts("YES"); } int main() { //freopen("datain.txt","r",stdin);while(cin>>n>>m){ getchar(); cnt=0; IDcache.clear(); string s; for(int i=0;i<n;i++){ getline(cin,s); int lastpos=0; for(int j=0;j<m;j++){ int p=s.find(',',lastpos); id[i][j]=ID(s.substr(lastpos,p-lastpos)); lastpos=p+1; } } findAns(); } }

转载于:https://www.cnblogs.com/hanker99/p/11204838.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值