原题:
思路:用一个IDcache去给所有字符串分配ID,再利用pair构成二元组。维护左端点c1,枚举右端点c2,同时遍历row从上到下扫分配的id库。查询第row行pair(c1,c2)是否存在即可。
代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>//集合
#include<map>//映射
#include<vector>//向量
#include<utility>//pair
#define DEBUG
using namespace std;
map<string,int> IDcache;//记录ID
map<pair<int,int>,int> Binary_pair;//记录二元组所在row
int cnt=0;
int ID(string s)//分配ID
{
if(IDcache.count(s))
{
return IDcache[s];
}
else
{
return IDcache[s]=cnt++;
}
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m;
while(cin>>n>>m)
{
IDcache.clear();
Binary_pair.clear();
vector<vector<int>> dict(n,vector<int>(m));//存放ID
string s;
cnt=0;
cin.get();//消去换行
for(int i=0;i<n;i++)
{
getline(cin,s);
for(int j=0;j<s.length();j++)
{
if(s[j]==',')
{
s[j]=' ';//将逗号替换为空格分隔
}
else if(s[j]==' ')
{
s[j]=',';//将空格替换为不可能出现的逗号
}
}
stringstream ss(s);//字符串流
for(int j=0;j<m;j++)
{
string cur;
ss>>cur;
dict[i][j]=ID(cur);
}
}
#ifndef DEBUG//调试语句
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<dict[i][j]<<" ";
}
cout<<endl;
}
#endif
if(m>1)
{
for(int c1=0;c1<m-1;c1++)//维护左端点
{
for(int c2=c1+1;c2<m;c2++)//枚举右端点
{
Binary_pair.clear();
for(int row=0;row<n;row++)//自上而下遍历
{
pair<int,int> temp(dict[row][c1],dict[row][c2]);
if(Binary_pair.count(temp))//并非Peter范式
{
cout<<"NO"<<endl;
cout<<Binary_pair[temp]+1<<" "<<row+1<<endl;
cout<<c1+1<<" "<<c2+1<<endl;
goto out;//跳出多重循环
}
else
{
Binary_pair[temp]=row;
}
}
}
}
}
cout<<"YES"<<endl;
out:;
}
return 0;
}