Database(pair+预处理)

给出一个表格,问有没有r1、r2、c1、c2满足着两行与两列相交的单元格内部分别相同。

首先进行预处理,,给每一种数据分配ID,将string转化为int。

然后使用pair,把两个int组成二元组,存在另一个map里,之后单次遍历储存查找。

PS:这是UVa上Ac的第50道题。

#include<iostream>#include<cstring>#include<string>#include<map>using namespace std;int a[10010][15];typedef pair<int,int>two_data;map<string,int>data_id;map<two_data,int>data_r;//二元组映射。string s0;int main(){int m,n;while(cin>>m>>n){int t=1;getchar();string s;for(int i=0;i<m;i++){int k=0;getline(cin,s);string x;for(int j=0;j<s.length();j++){//预处理分配ID。if(s[j]!=',') x+=s[j];if(s[j]==','||j==s.length()-1){if(!data_id.count(x)){data_id[x]=t;t++;}a[i][k]=data_id[x];x=s0;k++;}}}for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){for(int k=0;k<m;k++){int x=a[k][i],y=a[k][j];if(data_r.count(make_pair(x,y))){//遍历数据库查找相同组。cout<<"NO"<<endl;cout<<data_r[make_pair(x,y)]+1<<" "<<k+1<<endl;cout<<i+1<<" "<<j+1<<endl;goto END;}data_r[make_pair(x,y)]=k;}data_r.clear();}}cout<<"YES"<<endl;END:data_id.clear();data_r.clear();memset(a,0,sizeof(a));}return 0;}

懂得倾听别人的忠告。

Database(pair+预处理)

相关文章:

你感兴趣的文章:

标签云: