• 1592 - Database (UVA)


    题目链接如下:

    Online Judge

    这道题刘汝佳的解法复杂度要低很多。注意到m远小于n,他的解法是遍历不同的列组合c1, c2, 然后再遍历行,如果对应元素相同,输出。

    我的解法复杂度高很多,但这道题的时间限制有9秒,所以能AC.....

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. // #define debug
    8. const int maxN = 10001;
    9. const int maxM = 11;
    10. const int comma = 44;
    11. int n, m, pos, pre, cnt = 0;
    12. int table[maxN][maxM];
    13. std::string line, str;
    14. std::mapint> mp;
    15. char ch;
    16. bool flag;
    17. int main(){
    18. #ifdef debug
    19. freopen("0.txt", "r", stdin);
    20. freopen("1.txt", "w", stdout);
    21. #endif
    22. while(scanf("%d %d", &n, &m) == 2){
    23. getchar();
    24. for(int i = 1; i <= n; ++i){
    25. getline(std::cin, line);
    26. line.push_back(',');
    27. pre = -1;
    28. for(int j = 1; j <= m; ++j){
    29. pos = line.find(',', pre + 1);
    30. str = line.substr(pre + 1, pos - pre - 1);
    31. pre = pos;
    32. if(mp.find(str) == mp.end()){
    33. mp[str] = ++cnt;
    34. }
    35. table[i][j] = mp[str];
    36. }
    37. }
    38. flag = true;
    39. for(int i = 1; i < n; ++i){
    40. for(int j = i + 1; j <= n; ++j){
    41. std::set<int> st;
    42. for(int k = 1; k <= m; ++k){
    43. if(table[i][k] == table[j][k]){
    44. st.insert(k);
    45. }
    46. }
    47. if(st.size() > 1){
    48. printf("NO\n%d %d\n%d %d\n", i, j, *(st.begin()), *(++st.begin()));
    49. flag = false;
    50. i = n;
    51. break;
    52. }
    53. }
    54. }
    55. printf("%s", flag ? "YES\n" : "");
    56. }
    57. #ifdef debug
    58. fclose(stdin);
    59. fclose(stdout);
    60. #endif
    61. return 0;
    62. }

    根据刘汝佳解法改写的代码如下,还是快不少的:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. // #define debug
    7. const int maxN = 10001;
    8. const int maxM = 11;
    9. const int comma = 44;
    10. const int hashMul = 100001;
    11. int n, m, pos, pre, cnt = 0;
    12. int table[maxN][maxM];
    13. std::string line, str;
    14. std::mapint> mp;
    15. char ch;
    16. bool flag;
    17. int main(){
    18. #ifdef debug
    19. freopen("0.txt", "r", stdin);
    20. freopen("1.txt", "w", stdout);
    21. #endif
    22. while(scanf("%d %d\n", &n, &m) == 2){
    23. mp.clear();
    24. for(int i = 1; i <= n; ++i){
    25. getline(std::cin, line);
    26. line.push_back(',');
    27. pre = -1;
    28. for(int j = 1; j <= m; ++j){
    29. pos = line.find(',', pre + 1);
    30. str = line.substr(pre + 1, pos - pre - 1);
    31. pre = pos;
    32. if(mp.find(str) == mp.end()){
    33. mp[str] = ++cnt;
    34. }
    35. table[i][j] = mp[str];
    36. }
    37. }
    38. flag = true;
    39. for(int i = 1; i < m; ++i){
    40. for(int j = i + 1; j <= m; ++j){
    41. std::map<int, int> p;
    42. for(int k = 1; k <= n; ++k){
    43. int temp = table[k][i] * hashMul + table[k][j];
    44. if(p.count(temp)){
    45. printf("NO\n%d %d\n%d %d\n", p[temp], k, i, j);
    46. flag = false;
    47. j = m + 1;
    48. i = m + 1;
    49. break;
    50. } else{
    51. p[temp] = k;
    52. }
    53. }
    54. }
    55. }
    56. printf("%s", flag ? "YES\n" : "");
    57. }
    58. #ifdef debug
    59. fclose(stdin);
    60. fclose(stdout);
    61. #endif
    62. return 0;
    63. }

  • 相关阅读:
    【软考学习14】绝对路径和相对路径的区别和联系
    缓存空间优化实践
    工业互联网平台的建设路径和技术要点是什么?
    cmake入门教程 跨平台项目构建工具cmake介绍
    在C#方法中 out、ref、in、params 关键字的用法
    双十一数据背后: 电商助力实体经济数字化转型才是未来方向
    C语言tips-字符串数组
    Matlab:tftb-0.2时频工具箱安装小记
    MySQL进阶4,常见函数
    35岁以后还能学软件测试吗?
  • 原文地址:https://blog.csdn.net/linh2006/article/details/133888225