题目链接如下:
这道题刘汝佳的解法复杂度要低很多。注意到m远小于n,他的解法是遍历不同的列组合c1, c2, 然后再遍历行,如果对应元素相同,输出。
我的解法复杂度高很多,但这道题的时间限制有9秒,所以能AC.....
cpp
#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 debug
freopen("0.txt", "r", stdin);
freopen("1.txt", "w", stdout);
#endif
while(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 debug
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
根据刘汝佳解法改写的代码如下,还是快不少的:
cpp
#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 debug
freopen("0.txt", "r", stdin);
freopen("1.txt", "w", stdout);
#endif
while(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 debug
fclose(stdin);
fclose(stdout);
#endif
return 0;
}