题意

给出一个数据库进行查重。假如(x1,y1)=(x1,y2)且(x2,y1)=(x2,y1),即重复,不合格。

想法

参照白书

对于字符串,为了加快比较速度,可以使用map来分配整数值,从而加快比较速度。

先枚举两列,然后从上到下将每行的该两列两个表格加入map,可以通过map查重。

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<map>
using namespace std;
const int MAXN=10000+5;
int s[MAXN][12];
int h,l;
int nh,nl;
int nowhash;
map<string,int>gethash;
int distributeHash(string ss){
    if(gethash.count(ss))return gethash[ss];
    gethash[ss]=nowhash++;
    return nowhash-1;
}
int main(){
    while(scanf("%d%d\n",&h,&l)!=EOF){
        nh=nl=1;
        nowhash=0;
        gethash.clear();
        memset(s,0,sizeof(s));
        char c;
        
        for(nh=1;nh<=h;nh++){
            nl=1;
            //cout<<"nh="<<nh<<endl;
            string ss;
            while(scanf("%c",&c)){
                if(c==','||c=='\n'){
                    s[nh][nl]=distributeHash(ss);
                    nl++;
                    //cout<<ss<<" "<<s[nh][nl-1]<<endl;
                    ss.clear();
                    if(c=='\n')break;
                }
                else
                    ss+=c;
            }
            
        }
        bool NO=false;
        for(int i=1;i<l;i++){
            for(int j=i+1;j<=l;j++){
                map<pair<int,int>,int>vis;
                for(int k=1;k<=h;k++){
                
                    if(!vis.count(make_pair(s[k][i],s[k][j])))
                        vis[make_pair(s[k][i],s[k][j])]=k;
                    else{
                        printf("NO\n%d %d\n%d %d\n",vis[make_pair(s[k][i],s[k][j])],k,i,j);
                        NO=true;
                        break;  
                    }
                    if(NO)break;
                }
                if(NO)break;
            }
            if(NO)break;
        }
        if(!NO)printf("YES\n");     
    }
    return 0;
}
 posted on 2017-01-29 14:03  cylcy  阅读(179)  评论(0编辑  收藏  举报