zoukankan      html  css  js  c++  java
  • UVa1592_数据库

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<utility>
    #include<map>
    #include<sstream>
    #include<string> 
    using namespace std;
    
    typedef pair<int, int> PII;
    
    const int maxr = 10000 + 5;
    const int maxc = 10 + 5;
    
    int m, n, db[maxr][maxc], cnt;  //m为当前的行数,n为当前列数,db储存所有的id值,cnt形成id
    
    map<string, int> id;            //将先将字符串映射成id值 
    int ID(const string& s)         //本题重要思想!转换成id值 
    {
        if (! id.count(s))      //如果字符串s的数目为0
        {
            id[s] = ++cnt;      //形成id值 
        }
        return id[s];           //否则直接返回对应的id值
    }
    
    //相邻两列情况下 枚举每行 
    void find()              
    {
        for (int c1 = 0; c1 < m; c1++)
        {
            for (int c2 = c1+1; c2 < m; c2++) //相邻两列向每行枚举
            {
                map<PII, int> d;              //将二元组映射成行数
                for (int i = 0; i < n; i++)   //枚举每行
                {
                    PII p = make_pair(db[i][c1], db[i][c2]);//两列的id值形成一个二元组 
                    //make_pair()能从两个变量构造一个pair形成一个二元组
                    if (d.count(p))    {         //二元组出现的次数不止一次 
                        cout << "No
    ";       
                        cout << d[p] + 1 << ' ' << i+1 << endl;  //打印行(2行)
                        cout << c1 + 1 << ' ' << c2+1 << endl;   //打印两列
                        return; 
                    }
                    d[p] = i;    //否则将该行(key)映射到相应的二元组中去
                 } 
            }
            cout << "YES
    " << endl; 
        }
    }
    
    int main()
    {
        string s;
        while (getline(cin, s)) 
        {
            stringstream ss(s);
            if (! (ss >> n >> m))   //行列输入错误,break; 
                break;
            cnt = 0;               //每组数据形成id的值初始化为0 
            id.clear();            //每次都清空数据
            for (int i = 0; i < n; i++) {
                getline(cin, s);   //输入一行字符串,每列用 “,”隔开
                int lastpos = -1;
                for (int j = 0; j < m; j++) {
                    int p = s.find(',', lastpos + 1);  //从lastpos+1开始,寻找在','
                                                 //在字符串第一次出现的位置--相当于每列结束
                    if (p == string::npos)       //最后一列之后没有逗号 
                        p = s.length();     
                    //将一列的开始到该列结束位置的字符串形成id值储存在db中 
                    db[i][j] = ID(s.substr(lastpos+1, p-lastpos-1)); 
                    lastpos = p;    //将本列字符串最后的位置置为lastpos,等下一次开始位置即为下一列 
                } 
            }
            find(); 
        }
        return 0;
    }

     

  • 相关阅读:
    为Fiddler增加Burp-like Inspector扩展 实现类似Burpsuite爆破、一键重放、编码转换等功能
    SVN常见问题总结一
    手把手教你学SVN
    js基本语法汇总
    最全的常用正则表达式大全
    CSS padding margin border属性详解
    从零开始学习jQuery (五) 事件与事件对象
    js正则表达式语法
    浏览器内部工作原理
    原生AJAX入门讲解(含实例)
  • 原文地址:https://www.cnblogs.com/douzujun/p/5414203.html
Copyright © 2011-2022 走看看