//使用map<pair<string,string>,int> 注意map查找比较字符串真心慢,建议用数字添加map,下面就是使用string添加造成比另外一个多出一倍时间
//字符串转数字表示同 集合栈计算机
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<utility>
#include<map>
using namespace std;
vector<string> shz[10005];
map<pair<string,string>,int> mp;
string str;
char chr;
int main(){
int a,b;
while(cin>>a>>b){
//获得数据块
getchar();//读取掉3 3 后面的\r \n
for(int i=0;i<a;i++){
shz[i].clear();//注意数据结构初始化
while(chr=getchar()){
// cout<<chr<<endl;
if(chr=='\r'||chr=='\n'){
// cout<<str<<endl;
shz[i].push_back(str);
str.clear();
break;
}
if(chr==','){
// cout<<str<<endl;
shz[i].push_back(str);
str.clear();
}
else str=str+chr;
}
}
for(int c1=0;c1<b;c1++){
for(int c2=c1+1;c2<b;c2++){
mp.clear();
for(int i=0;i<a;i++){
pair<string,string> p=make_pair(shz[i][c1],shz[i][c2]);
if(mp.count(p)){//map字符串查找比较很花时间,建议用字符串矩阵转数字矩阵的方法进行 比较操作 集合栈计算机也是如此
cout<<"NO"<<endl;
cout<<mp[p]+1<<" "<<i+1<<endl;
cout<<c1+1<<" "<<c2+1<<endl;
goto label;
}
mp[p]=i;
}
}
}
cout<<"YES"<<endl;
label:;
}
return 0;
}
//使用数字化map结果时间就降下来了
#include<iostream>
#include<cstdio>
#include<utility>
#include<string>
#include<vector>
#include<map>
using namespace std;
vector<string> vect;
map<string,int> mp;
vector<int> shz[10005];
int translate(string str){
if(mp.count(str)) return mp[str];
vect.push_back(str);
return mp[str]=vect.size()+1;
}
int main(){
int a,b;
string str;
char chr;
while(cin>>a>>b){
mp.clear();
vect.clear();
getchar();
//字符串矩阵转数字矩阵
for(int i=0;i<a;i++){
shz[i].clear();
while(chr=getchar()){
if(chr=='\n'||chr=='\r'){
shz[i].push_back(translate(str));
str.clear();
break;
}
if(chr==','){
shz[i].push_back(translate(str));
str.clear();
}
else str+=chr;
}
}
//双重循环比较转单层比较使用map
map<pair<int,int>,int> mpp;
for(int c1=0;c1<b;c1++){
for(int c2=c1+1;c2<b;c2++){
mpp.clear();
for(int i=0;i<a;i++){
pair<int,int> p=make_pair(shz[i][c1],shz[i][c2]);
if(mpp.count(p)){
cout<<"NO"<<endl;
cout<<mpp[p]+1<<" "<<i+1<<endl;
cout<<c1+1<<" "<<c2+1<<endl;
goto label;
}
mpp[p]=i;
}
}
}
cout<<"YES"<<endl;
label:;
}
return 0;
}