算法竞赛入门经典紫书P128 这题真是巧妙,用pair可以大幅的减少运行时间,我也学习了一发,虽然我不是怎么会做,自己写了一遍也差不多掌握了,重要的是解题的思想。
各种初始化和对字符串的处理也是难点,用map将每个字符串化成数字,然后用pair寻找 满足条件的。
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<stack>
using namespace std;
#define MAX 105
typedef long long LL;
const double pi=3.141592653589793;
const int INF=1e9;
const double inf=1e20;
map<string,int> data;
map<pair<int,int>,int> data1;
int a[10005][11];
int main()
{
int n,m;
string s,s0;
while(cin>>n>>m)
{
int t=0;
getchar();
for(int i=0; i<n; i++)
{
getline(cin,s);
string x;
int xcount=0;
for(int j=0; j<s.size(); j++)
{
if(s[j]!=',') x+=s[j];
if(s[j]==','||j==s.size()-1)
{
if(!data.count(x))
{
data[x]=t;
t++;
}
a[i][xcount++]=data[x];
x=s0;//初始化
}
}
}
int flag=0;
for(int i=0;i<m-1;i++)//枚举列复杂度低
{
for(int j=i+1;j<m;j++)
{
for(int k=0;k<n;k++)
{
int x=a[k][i];
int y=a[k][j];
if(data1.count(make_pair(x,y)))//把x,y看成一个元素,可以少枚举一行
{
printf("NO\n%d %d\n%d %d\n",data1[make_pair(x,y)]+1,k+1,i+1,j+1);
flag=1;
break;
}
data1[make_pair(x,y)]=k;
}
data1.clear();
if(flag) break;
}
if(flag) break;
}
if(!flag) printf("YES\n");
data.clear();
data1.clear();
}
return 0;
}