uva 1592 Database (STL)

题意:

给出n行m列共n*m个字符串,问有没有在不同行r1,r2,有不同列c1,c2相同。即(r1,c1) = (r2,c1);(r1,c2) = (r2,c2);

2 3

123,456,789

123,654,789

(1,3) 就对应(3,3)

如果有这种对应,就输出NO,然后输出两个行号, 两个列号。否则输出YES。

分析:

将每个字符串映射成一个值。

枚举任意两列,构成一对pair,枚举任意两行是否相等,任意两列组合C(10,2) = 45种 行最多有10000行。

其实这种方法很慢,只是为了练习STL,正常做法会用char数组和hash

 1 #include <bits/stdc++.h>
 2 const int maxr = 10000 + 5;
 3 const int maxc = 10 + 5;
 4 using namespace std;
 5 typedef pair<int,int> PII;
 6 int n, m, cnt;
 7 int db[maxr][maxc];
 8 map<string, int> id;
 9
10 void debug()//观察dp数组映射的值
11 {
12     for(int i = 0; i < n; i++)
13     {
14         for(int j = 0; j < m; j++)
15         {
16             cout << db[i][j] <<" ";
17         }
18         cout<< "\n";
19     }
20
21 }
22 int ID(const string& s)
23 {
24     if(id.count(s))
25         return id[s];
26     else return id[s] = ++cnt;
27 }
28 void solve()
29 {
30     //寻找任意两列,观察任意两行是否相等 任意两列组合45种 行共有10000行 循环45W次
31     for(int c1 = 0; c1 < m; c1++)
32     {
33         for(int c2 = c1 +1 ; c2 < m; c2++)
34         {
35             map<PII, int> d;//注意存活周期,只存在任意两列的循环中
36             for(int i = 0; i < n ; i++)
37             {
38                 PII p = make_pair(db[i][c1], db[i][c2]);
39                 if(d.count(p))
40                 {
41                     printf("NO\n");
42                     printf("%d %d\n",d[p]+1, i+1);
43                     printf("%d %d\n",c1+1,c2+1);
44                     return;
45                 }
46                 d[p] = i;
47             }
48         }
49     }
50     printf("YES\n");
51 }
52 int main()
53 {
54 //    freopen("1.txt","r",stdin);
55     string s;
56     while(getline(cin,s))
57     {
58         stringstream ss(s);
59         if(!(ss >> n >> m)) break;
60         for(int i = 0; i < n; i++)
61         {
62             string t;
63             getline(cin,t);
64             for(int j = 0; j < t.length(); j++)
65             {
66                 if(t[j] == ‘,‘) t[j] = ‘ ‘;
67                 else if(t[j] == ‘ ‘) t[j] = ‘$‘;
68             }
69             stringstream st(t);
70             for(int j = 0; j < m; j++)
71             {
72                 string t1;
73                 st >> t1;
74 //                cout<<t1<<"\n";
75                 db[i][j] = ID(t1);
76             }
77         }
78 //        debug();
79         solve();
80     }
81     return 0;
82 }
时间: 2024-10-12 20:28:04

uva 1592 Database (STL)的相关文章

UVa 1592模拟(map)

背景:第一因为找到结果之后没有及时的停止查找而wa了一发,改正后ac. 思路:首先对读入的每一个string,设置一个独特的ID,这样就把string变为int,后来比较的时候就会简化很多,设置ID的时候用map来赋予每一种string对应一个独特的ID.然后构建一个key为pair<int,int>的map,因为行比较多列比较少(列的数为10),就枚举列的所有组合,然后对每组组合来进行map判重. 我的代码: #include <set> #include <stack&g

UVA - 10534Wavio Sequence(LIS)

题目:UVA - 10534Wavio Sequence(LIS) 题目大意:给出N个数字,找出这样的序列:2 * n + 1个数字组成.前面的n + 1个数字单调递增,后面n + 1单调递减. 解题思路:从前往后找一遍LIS,再从后往前找一遍LIS.最后只要i这个位置的LIS的长度和LDS的长度取最小值.再*2 - 1就是这个波浪数字的长度.注意这里的求LIS要用nlog(n)的算法,而且这里的波浪数字的对称并不是要求i的LIS == LDS,而是只要求LIS和LDS最短的长度就行了,长的那个

uva 725 Division(除法)暴力法!

uva 725  Division(除法) A - 暴力求解 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Write a program that finds and displays all pairs of 5-digit numbers that between them use the digits 0 through 9 once each, such that t

Uva 11889 - Benefit( 数论 )

Uva 11889 - Benefit( 数论 ) 题意: calculate the lowest integer B such that LCM(A, B) = C 分析: LCM(A,B) = C = A*B/GCD(A,B)C*GCD(A,B) = A*BC/A = B/GCD(A,B)如果C%A != 0 无解否则, 令t = C/AB = t * GCD(A,B) 即B 一定是 t 的整数倍从t开始枚举B #include <cstdio> typedef long long LL

UVA 10139 Factovisors(数论)

Factovisors The factorial function, n! is defined thus for n a non-negative integer: 0! = 1 n! = n * (n-1)! (n > 0) We say that a divides b if there exists an integer k such that k*a = b The input to your program consists of several lines, each conta

UVa10815 Andy&#39;s First Dictionary (STL)

链接:http://acm.hust.edu.cn/vjudge/problem/18649分析:set容器应用.set中每个元素最多只出现一次.自定义类型也可以构造set,必须定义“小于”运算符.set中的元素从小到大已排好序. 1 #include <iostream> 2 #include <string> 3 #include <cctype> 4 #include <set> 5 #include <sstream> 6 using n

标准模板库(STL)

1.标准模板库(STL):是为了提供通用的模板,这部分代码都是优质的代码,提高了编程人员的开发效率 2.vector向量:本质上来说对数组的封装:特点是在常数时间内完成读取:插入比较复杂:通过迭代器进行遍历 初始化vector向量的几种方式: vector<T> v1:vector保存类型为T的对象.默认构造v1为空 vector<T> v2(v1):v2是v1的一个副本 vector<T> v3(n,i):包含n个值为i的元素 vector<T> v4(n

.NET中是否可用标准模版库(STL)

分析问题 标准模版库(STL)实在惠普实验室开发出来的一套算法类库的集合,从概念上主要区分为三大部分: 1.算法(algorithm). 2.容器(container). 3.迭代器(iterrator). STL的设计都致力于打造通用的算法和类库,例如一个排序的算法,可能针对包含不同类型元素的集合进行排序.在C++中,这样的通用性需要依靠模版来实现,而在.NET中,则依靠泛型..NET中的STL类库有Wintellect团队开发完成,类库名称为Power Collections,作为一个通用的

UVA 1371 - Period(DP)

6.4 一些说明 数据属性可以重写同名的方法属性.这是为了避免在大型系统中产生问题的意外名称冲突.所以用一些减少冲突的常用方法是很有效果的.常用的方法包括:大写字母方法名称,用唯一的字符串来做为数据属性的名称(可以是个下划线_)或者用动词命名方法和用名字命名数据属性. 数据属性就像和对象的普通用户一样可以被方法引用.换句话说,类不能用来实现纯净的数据类型.事实上,在python中不能强制数据隐藏,一切基于约定.(另一方面,如C中写的,python的实现可以做到完全隐藏实现细节并且在必要是可以控制