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