这个题开得有点晚,只是因为读不懂题,这个题也提供了一个好思路来优化代码。
首先,把字符串映射到整形,然后相比整形而不是字符串,大大缩短时间。
题意:输出表格中存在的 r1,r2 ,c1,c2使得表格的r1行c1列与r2行c1列相同,r1行c1列与r2行c1列相同。
AC源码:
#include<iostream>
#include<string>
#include<map>
#include<cstdio>
using namespace std;
int num[10010][15];
int m,n;
void input(){
map<string, int> mp;
int cnt(0);
for(int mi=0; mi<m ; mi++){
string s_;
getline(cin,s_);
int st(0);
int en=s_.find(',',0);
for(int i =0;i<n;i++){
if(i==n-1){
string s1( s_.begin()+ st , s_.end());
if(mp.count(s1)) num[mi][i]=mp[s1];
else num[mi][i]=(mp[s1]=cnt++);
}
else{
string s1( s_.begin()+ st , s_.begin()+en);
st=en+1;
en=s_.find(',',st);
if(mp.count(s1)) num[mi][i]=mp[s1];
else num[mi][i]=(mp[s1]=cnt++);
}
}
}
}
void solve(){
for(int i =0;i<m-1;i++)
for(int j=i+1;j<m;j++){
int have=0;
int c[2];
for(int k=0;k<n;k++){
if(num[i][k]==num[j][k]){
c[have++]=k;
if(have==2){
cout<<"NO"<<endl;
cout<<i+1<<" "<<j+1<<endl;
cout<<c[0]+1<<" "<<c[1]+1<<endl;
return;
}
}
}
}
cout<<"YES"<<endl;
}
int main(){
while(cin>>m>>n){cin.get();
input();
solve();
}
return 0;
}