题意
给出一个数据库进行查重。假如(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;
}