题目链接
题意大意:
输入一个n*m的数据矩阵 A,问是否存在这两个不同的行 r1 和 r2 及两个不同的 c1 和 c2,使得以下的关系成立:
A(r1,c1) = A(r2,c1) && A(r1,c2) = A(r2,c2)
如果存在,第一行输出 NO,第二行输出 r1 , r2 ;第三行输出c1, c2 。
不存在,直接输出 YES 。
题目分析:
- 暴力枚举r1,r2,c1,c2会超时。
- 题目实际上要找的就是一个2×2的子阵,该子阵的第一行的行向量和第二行的行向量相等。
- 可以将原问题中矩阵的每一个元素(即一段字符串)映射到整数,然后只枚举c1和c2,然后扫描各行,判断是否有两个相等的行向量。
- 此处为2维行向量,故可以用pair来表示这个行向量,并且将每一行的行向量与对应的行号做一个映射(使用map)。
代码实现:
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
typedef pair<int,int > PII;
const int maxr = 10000+10; // 行数最大值
const int maxc = 10+10; // 列数最大值
int row,col,id,dp