码迷,mamicode.com
首页 > 数据库 > 详细

UVA-1592 Database

时间:2015-04-21 00:19:59      阅读:920      评论:0      收藏:0      [点我收藏+]

标签:

第一篇文章,以后会坚持写的。
这道题目就是找r1,r2,c1,c2使得(r1,c1)和(r2,c1)相等,(r1,c2)和(r2,c2)相等
对效率有一定要求,不小心就会TLE
最初的算法是枚举r1,r2然后横向扫描,时间复杂度为Θ(n^3)无疑TLE。

后来经过改进将每个string与处映射成一个数,枚举c1,c2然后从上往下扫描将(r,c1)(r,c2)字符串对应的两个整数
组合成一个结构体作为map的键值,用r作为value,若键值已存在就为所求。
注意尽量将string映射成int的值存在一个二维数组中,map查找也是要时间的。
映射的值也尽量在输入中计算,否则单独计算也是要Θ(n^2)时间

最后勉勉强强AC了吧,不过效率还是有待改进,rank1 0.2几秒就过了,有空还会改的。
附代码

 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<map>
 5 #include<cstdio>
 6 using namespace std;
 7 struct kv
 8 {
 9     int k;
10     int v;
11     kv(int a,int b){
12         k=a;v=b;
13     }
14 };
15 bool operator < (const kv& a,const kv& b){
16     if(a.k<b.k)return 1;
17     if(a.k>b.k)return 0;
18 
19     return a.v<b.v;
20 }
21 int main()
22 {
23     //ios::sync_with_stdio(false);
24 
25     int m,n;
26     while(cin>>n>>m){
27         getchar();
28         char line[100];
29         string s[10020][11];
30         int a[n][m];
31         map<string,int> con;
32         int num=1;
33 
34         for(int i=0;i<n;i++){
35             gets(line);
36             int c=0;
37             int len=strlen(line);
38             for(int j=0;j<len;j++){
39                 if(line[j]==,){
40                     c++;
41                     if(!con.count(s[i][c-1])){
42                         con[s[i][c-1]]=num++;
43                         a[i][c-1]=num-1;
44                     }
45                     else a[i][c-1]=con[s[i][c-1]];
46                 }
47                 else s[i][c].push_back(line[j]);
48             }
49             if(!con.count(s[i][c])){
50                 con[s[i][c]]=num++;
51                 a[i][c]=num-1;
52             }
53             else a[i][c]=con[s[i][c]];
54         }
55 
56         int sign=0;
57         for(int c1=0;c1<m;c1++){
58             for(int c2=c1+1;c2<m;c2++){
59                 map<kv,int> database;
60                 for(int i=0;i<n;i++){
61                     kv k(a[i][c1],a[i][c2]);
62                     if(database.count(k)){
63                         sign=1;
64                         cout<<"NO"<<endl;
65                         cout<<database[k]<<" "<<i+1<<endl;
66                         cout<<c1+1<<" "<<c2+1<<endl;
67                         goto ssss;
68                     }
69                     else {
70                         database[k]=i+1;
71                     }
72                 }
73             }
74         }
75         ssss:;
76         if(sign==0)cout<<"YES"<<endl;
77     }
78     return 0;
79 }

 

UVA-1592 Database

标签:

原文地址:http://www.cnblogs.com/tooyoungtoosimple/p/4442912.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!