UVa - 1592 Database(STL,优化)

给一个n行m列的数据库表格,问有没有两个行 r1,r2 和 c1,c2,满足(r1,r2)的元素=(c1,c2)的元素。

n≤10000,m≤10。

直接枚举4个肯定会T的。可以只枚举c1 c2,然后枚举每一行,将c1 c2加入map里,下面再次枚举到就证明有。

pair是个很好用的东西。

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <map>
using namespace std;

#define maxn 10000 + 100

int main()
{
    int n, m;
    while(scanf("%d%d", &n, &m) != EOF)
    {
        getchar();
        vector<string> a[maxn];
        string s;
        for (int i = 1; i <= n; i++)
        {
            getline(cin, s);
            int len = s.size();
            string k = "";

            for (int j = 0; j < len; j++)
            if (s[j] == ',')
            {
                a[i].push_back(k);
                k = "";
            }
            else k += s[j];

            a[i].push_back(k);
        }

        int canfind = 0;
        int r1, r2, c1, c2;

        for (int k = 0; k < m; k++)
        for (int j = k+1; j < m; j++)
        {
            map<pair<string, string>, int> ss;
            for (int i = 1; i <= n; i++)
            {
                pair<string, string> t(a[i][k], a[i][j]);//pair的构造函数
                if (ss.count(t))
                {
                    canfind = 1;
                    r1 = ss[t], r2 = i;
                    c1 = k+1, c2 = j+1;
                    break;
                }
                else ss[t] = i;
            }
            if (canfind) break;
        }

        if (canfind)
        {
            printf("NO\n");
            printf("%d %d\n", r1, r2);
            printf("%d %d\n", c1, c2);
        }
        else
        {
            printf("YES\n");
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/ruthank/p/9022392.html