题目链接如下:
Online Judge
这道题刘汝佳的解法复杂度要低很多。注意到m远小于n,他的解法是遍历不同的列组合c1, c2, 然后再遍历行,如果对应元素相同,输出。
我的解法复杂度高很多,但这道题的时间限制有9秒,所以能AC.....
#include <iostream>
#include <cstdio>
#include <string>
#include <map>
#include <set>
#include <algorithm>
// #define debug
const int maxN = 10001;
const int maxM = 11;
const int comma = 44;int n, m, pos, pre, cnt = 0;
int table[maxN][maxM];
std::string line, str;
std::map<std::string, int> mp;
char ch;
bool flag;int main(){#ifdef debugfreopen("0.txt", "r", stdin);freopen("1.txt", "w", stdout);#endifwhile(scanf("%d %d", &n, &m) == 2){getchar();for(int i = 1; i <= n; ++i){getline(std::cin, line);line.push_back(',');pre = -1;for(int j = 1; j <= m; ++j){pos = line.find(',', pre + 1);str = line.substr(pre + 1, pos - pre - 1);pre = pos;if(mp.find(str) == mp.end()){mp[str] = ++cnt;}table[i][j] = mp[str];}}flag = true;for(int i = 1; i < n; ++i){for(int j = i + 1; j <= n; ++j){std::set<int> st;for(int k = 1; k <= m; ++k){if(table[i][k] == table[j][k]){st.insert(k);}}if(st.size() > 1){printf("NO\n%d %d\n%d %d\n", i, j, *(st.begin()), *(++st.begin()));flag = false;i = n;break;}}}printf("%s", flag ? "YES\n" : "");}#ifdef debugfclose(stdin);fclose(stdout);#endifreturn 0;
}
根据刘汝佳解法改写的代码如下,还是快不少的:
#include <iostream>
#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
// #define debug
const int maxN = 10001;
const int maxM = 11;
const int comma = 44;
const int hashMul = 100001;int n, m, pos, pre, cnt = 0;
int table[maxN][maxM];
std::string line, str;
std::map<std::string, int> mp;
char ch;
bool flag;int main(){#ifdef debugfreopen("0.txt", "r", stdin);freopen("1.txt", "w", stdout);#endifwhile(scanf("%d %d\n", &n, &m) == 2){mp.clear();for(int i = 1; i <= n; ++i){getline(std::cin, line);line.push_back(',');pre = -1;for(int j = 1; j <= m; ++j){pos = line.find(',', pre + 1);str = line.substr(pre + 1, pos - pre - 1);pre = pos;if(mp.find(str) == mp.end()){mp[str] = ++cnt;}table[i][j] = mp[str];}}flag = true;for(int i = 1; i < m; ++i){for(int j = i + 1; j <= m; ++j){std::map<int, int> p;for(int k = 1; k <= n; ++k){int temp = table[k][i] * hashMul + table[k][j];if(p.count(temp)){printf("NO\n%d %d\n%d %d\n", p[temp], k, i, j);flag = false;j = m + 1;i = m + 1;break;} else{p[temp] = k;}}}}printf("%s", flag ? "YES\n" : "");}#ifdef debugfclose(stdin);fclose(stdout);#endifreturn 0;
}