题目链接如下:
这道题刘汝佳的解法复杂度要低很多。注意到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
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;
- }
根据刘汝佳解法改写的代码如下,还是快不少的:
- #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
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;
- }