UVa 1592 Database ACM解题报告(map和pair的使用)

来源:互联网 发布:ubuntu owncloud 编辑:程序博客网 时间:2024/04/30 02:48

算法竞赛入门经典紫书P128  这题真是巧妙,用pair可以大幅的减少运行时间,我也学习了一发,虽然我不是怎么会做,自己写了一遍也差不多掌握了,重要的是解题的思想。

各种初始化和对字符串的处理也是难点,用map将每个字符串化成数字,然后用pair寻找 满足条件的。

#include<iostream>#include<cstdio>#include<cctype>#include<cstdlib>#include<cmath>#include<algorithm>#include<cstring>#include<string>#include<vector>#include<queue>#include<map>#include<set>#include<sstream>#include<stack>using namespace std;#define MAX 105typedef long long LL;const double pi=3.141592653589793;const int INF=1e9;const double inf=1e20;map<string,int> data;map<pair<int,int>,int> data1;int a[10005][11];int main(){    int n,m;    string s,s0;    while(cin>>n>>m)    {        int t=0;        getchar();        for(int i=0; i<n; i++)        {            getline(cin,s);            string x;            int xcount=0;            for(int j=0; j<s.size(); j++)            {                if(s[j]!=',') x+=s[j];                if(s[j]==','||j==s.size()-1)                {                    if(!data.count(x))                    {                        data[x]=t;                        t++;                    }                    a[i][xcount++]=data[x];                    x=s0;//初始化                }            }        }        int flag=0;        for(int i=0;i<m-1;i++)//枚举列复杂度低        {            for(int j=i+1;j<m;j++)            {                for(int k=0;k<n;k++)                {                    int x=a[k][i];                    int y=a[k][j];                    if(data1.count(make_pair(x,y)))//把x,y看成一个元素,可以少枚举一行                    {                        printf("NO\n%d %d\n%d %d\n",data1[make_pair(x,y)]+1,k+1,i+1,j+1);                        flag=1;                        break;                    }                    data1[make_pair(x,y)]=k;                }                data1.clear();                if(flag) break;            }            if(flag) break;        }        if(!flag) printf("YES\n");        data.clear();        data1.clear();    }    return 0;}


0 0
原创粉丝点击