这题用四重循环会TLE,我们枚举c1,c2,从上到下遍历每行,将c1,c2组成的二元组加入到map中,如果新行中出现的二元组已经出现过,则答案产生
写这道题收获的小技巧:
getline的新使用方法,可以加一个参数代表读取到那个字符结束
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
using namespace std;
typedef pair<int,int> P;
map<string,int> mp;
map<P,int> a;
int l[10005][15];
int main()
{
int n,m;
//freopen("E://text//text.txt","w",stdout);
while(cin >> n >> m){
mp.clear();
getchar();
string s;
int k = 0;
for(int i = 0 ; i <n ; i++){
for(int j = 0 ; j < m - 1 ;j++){
getline(cin,s,',');
if(mp.count(s)){
l[i][j] = mp[s];
}
else{
l[i][j] = k;
mp[s] = k++;
}
}
getline(cin,s,'\n');
if(mp.count(s)){
l[i][m-1] = mp[s];
}
else{
l[i][m-1] = k;
mp[s] = k++;
}
}
bool flag = false;
for(int i = 0 ; i < m ; i++){
for(int j = i + 1 ; j < m ; j++){
a.clear();
for(int k = 0 ; k <n ; k++){
P p = make_pair(l[k][i],l[k][j]);
if(a.count(p)){
cout << "NO" << endl;
cout << a[p] + 1 << " " << k + 1<< endl;
cout << i + 1 << " " << j + 1 << endl;
flag = true;
break;
}
else{
a.insert(make_pair(p,k));
}
}
if(flag) break;
}
if(flag) break;
}
if(!flag) cout << "YES" << endl;
}
return 0;
}