UVA 12504 Updating a Dictionary

题目链接:https://vjudge.net/problem/UVA-12504

题目翻译摘自《算法禁赛入门经典》

题目大意

  在本题中,字典是若干键值对,其中键为小写字母组成的字符串,值为没有前导零或正号的非负整数(-4,03 和 +77 都是非法的,注意该整数可以很大)。输入一个旧字典和一个新字典,计算二者的变化。输入的两个字典中键都是唯一的,但是排列顺序任意。

  输入包含两行,各包含不超过100个字符,即旧字典和新字典。输出格式如下:

  1. 如果至少有一个新增键,打印一个“+”号,然后是所有新增键,按字典序从小到大排列。
  2. 如果至少有一个删除键,打印一个“-”号,然后是所有删除键,按字典序从小到大排列。
  3. 如果至少有一个修改键,打印一个“*”号,然后是所有修改键,按字典序从小到大排列。
  4. 如果没有任何修改,输出No changes。

分析

  搞两个有序表一一对比即可。

代码如下

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3
  4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  5 #define Rep(i,n) for (int i = 0; i < (n); ++i)
  6 #define For(i,s,t) for (int i = (s); i <= (t); ++i)
  7 #define rFor(i,t,s) for (int i = (t); i >= (s); --i)
  8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
  9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
 10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
 11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
 12
 13 #define pr(x) cout << #x << " = " << x << "  "
 14 #define prln(x) cout << #x << " = " << x << endl
 15
 16 #define LOWBIT(x) ((x)&(-x))
 17
 18 #define ALL(x) x.begin(),x.end()
 19 #define INS(x) inserter(x,x.begin())
 20 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end())
 21 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end()); // 删去 x 中所有 c
 22 #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower);
 23 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper);
 24
 25 #define ms0(a) memset(a,0,sizeof(a))
 26 #define msI(a) memset(a,inf,sizeof(a))
 27 #define msM(a) memset(a,-1,sizeof(a))
 28
 29 #define MP make_pair
 30 #define PB push_back
 31 #define ft first
 32 #define sd second
 33
 34 template<typename T1, typename T2>
 35 istream &operator>>(istream &in, pair<T1, T2> &p) {
 36     in >> p.first >> p.second;
 37     return in;
 38 }
 39
 40 template<typename T>
 41 istream &operator>>(istream &in, vector<T> &v) {
 42     for (auto &x: v)
 43         in >> x;
 44     return in;
 45 }
 46
 47 template<typename T1, typename T2>
 48 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
 49     out << "[" << p.first << ", " << p.second << "]" << "\n";
 50     return out;
 51 }
 52
 53 inline int gc(){
 54     static const int BUF = 1e7;
 55     static char buf[BUF], *bg = buf + BUF, *ed = bg;
 56
 57     if(bg == ed) fread(bg = buf, 1, BUF, stdin);
 58     return *bg++;
 59 }
 60
 61 inline int ri(){
 62     int x = 0, f = 1, c = gc();
 63     for(; c<48||c>57; f = c==‘-‘?-1:f, c=gc());
 64     for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
 65     return x*f;
 66 }
 67
 68 template<class T>
 69 inline string toString(T x) {
 70     ostringstream sout;
 71     sout << x;
 72     return sout.str();
 73 }
 74
 75 inline int toInt(string s) {
 76     int v;
 77     istringstream sin(s);
 78     sin >> v;
 79     return v;
 80 }
 81
 82 //min <= aim <= max
 83 template<typename T>
 84 inline bool BETWEEN(const T aim, const T min, const T max) {
 85     return min <= aim && aim <= max;
 86 }
 87
 88 typedef long long LL;
 89 typedef unsigned long long uLL;
 90 typedef pair< double, double > PDD;
 91 typedef pair< int, int > PII;
 92 typedef pair< int, PII > PIPII;
 93 typedef pair< string, int > PSI;
 94 typedef pair< int, PSI > PIPSI;
 95 typedef set< int > SI;
 96 typedef set< PII > SPII;
 97 typedef vector< int > VI;
 98 typedef vector< double > VD;
 99 typedef vector< VI > VVI;
100 typedef vector< SI > VSI;
101 typedef vector< PII > VPII;
102 typedef map< int, int > MII;
103 typedef map< int, string > MIS;
104 typedef map< int, PII > MIPII;
105 typedef map< PII, int > MPIII;
106 typedef map< string, int > MSI;
107 typedef map< string, string > MSS;
108 typedef map< PII, string > MPIIS;
109 typedef map< PII, PII > MPIIPII;
110 typedef multimap< int, int > MMII;
111 typedef multimap< string, int > MMSI;
112 //typedef unordered_map< int, int > uMII;
113 typedef pair< LL, LL > PLL;
114 typedef vector< LL > VL;
115 typedef vector< VL > VVL;
116 typedef priority_queue< int > PQIMax;
117 typedef priority_queue< int, VI, greater< int > > PQIMin;
118 const double EPS = 1e-8;
119 const LL inf = 0x7fffffff;
120 const LL infLL = 0x7fffffffffffffffLL;
121 const LL mod = 1e9 + 7;
122 const int maxN = 1e4 + 7;
123 const LL ONE = 1;
124 const LL evenBits = 0xaaaaaaaaaaaaaaaa;
125 const LL oddBits = 0x5555555555555555;
126
127 int T;
128 string tmp;
129 MSS A, B;
130 MIS mis = {MP(0, "+"), MP(1, "-"), MP(2, "*")};
131
132 void analysis(MSS &x, string s) {
133     foreach(i, s) if(*i == ‘{‘ || *i == ‘}‘ || *i == ‘,‘ || *i == ‘:‘) *i = ‘ ‘;
134     stringstream sin(s);
135     string a, b;
136
137     while(sin >> a >> b) x[a] = b;
138 }
139
140 int main(){
141     //freopen("MyOutput.txt","w",stdout);
142     //freopen("input.txt","r",stdin);
143     //INIT();
144     cin >> T;
145     while(T--) {
146         set< string > changes[3];
147         A.clear();
148         B.clear();
149         cin >> tmp;
150         analysis(A, tmp);
151         cin >> tmp;
152         analysis(B, tmp);
153
154         auto itA = A.begin(), itB = B.begin();
155         while(itA != A.end() && itB != B.end()) {
156             if(itA->ft == itB->ft) {
157                 if(itA->sd != itB->sd) changes[2].insert(itA->ft);
158                 ++itA;
159                 ++itB;
160             }
161             else if(itA->ft > itB->ft) {
162                 changes[0].insert(itB->ft);
163                 ++itB;
164             }
165             else {
166                 changes[1].insert(itA->ft);
167                 ++itA;
168             }
169         }
170
171         while(itA != A.end()) {
172             changes[1].insert(itA->ft);
173             ++itA;
174         }
175
176         while(itB != B.end()) {
177             changes[0].insert(itB->ft);
178             ++itB;
179         }
180
181         if(changes[0].empty() && changes[1].empty() && changes[2].empty()) printf("No changes\n\n");
182         else {
183             Rep(i, 3) {
184                 if(!changes[i].empty()) {
185                     cout << mis[i];
186                     foreach(j, changes[i]) {
187                         if(j != changes[i].begin()) cout << ",";
188                         cout << *j;
189                     }
190                     cout << endl;
191                 }
192             }
193             cout << endl;
194         }
195     }
196     return 0;
197 }

原文地址:https://www.cnblogs.com/zaq19970105/p/11074863.html

时间: 2024-11-06 07:22:58

UVA 12504 Updating a Dictionary的相关文章

UVa 12504 Updating a Dictionary(更新字典)

题意  比较两个字典  按字典序输出所有添加 删除 修改的项   如果没有任何更新  输出  No changes STL map的应用  对比两个字典  注意开始字符串的处理和字典可以为空 #include<bits/stdc++.h> using namespace std; map<string, string> d[2]; map<string, string>::iterator it; const int N = 105; string s, a, b, t

【UVA】12504 - Updating a Dictionary(map,string,vector模拟)

一般的模拟题,一开始WA,可能是用string的容器放char,改成string就过了 14073581 12504 Updating a Dictionary Accepted C++ 0.032 2014-08-21 07:12:19 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<st

【UVA】12504 Updating a Dictionary(STL)

题目 题目 ? ? 分析 第一次用stringstream,真TMD的好用 ? ? 代码 #include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; getchar();//回车 while(n--) { string s1,s2; getline(cin,s1); getline(cin,s2); for(int i=0;i<s1.length();i++) if(!isalpha(s1

Uva 511 Updating a Dictionary

大致题意:用{ key:value, key:value, key:value }的形式表示一个字典key表示建,在一个字典内没有重复,value则可能重复 题目输入两个字典,如{a:3,b:4,c:10,f:16}  {a:3,c:5,d:10,ee:4} 于新字典相比,找出旧字典的不同,并且输出用相应格式,增加的用'+',如 +d,ee 减少的用'-',如 -b,f value变化的用*,如 *c 没有不同则输出"No changes"" 如果使用java,则可以用Tre

Uva 10815-Andy&#39;s First Dictionary(串)

Problem B: Andy's First Dictionary Time limit: 3 seconds Andy, 8, has a dream - he wants to produce his very own dictionary. This is not an easy task for him, as the number of words that he knows is, well, not quite enough. Instead of thinking up all

UVA 10815-Andy&#39;s First Dictionary(字符串模拟+排序+重复删除)

Andy's First Dictionary Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description Problem B: Andy's First Dictionary Time limit: 3 seconds Andy, 8, has a dream - he wants to produce his very own dictionary. This

UVA - 12504

 Updating a Dictionary  In this problem, a dictionary is collection of key-value pairs, where keys are lower-case letters, and values are non-negative integers. Given an old dictionary and a new dictionary, find out what were changed. Each dictionary

CSU 1113 Updating a Dictionary(map容器应用)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113 解题报告:输入两个字符串,第一个是原来的字典,第二个是新字典,字典中的元素的格式为一个关键字对应一个值,输入格式如下: {a:3,b:4,c:10,f:6} {a:3,c:5,d:10,ee:4}冒号前面的表示关键字,冒号后面的数字表示值,关键字由小写字母组成.现在让你判断,如果新的字典相对于原来的字典有新增的关键字以以下格式输出 :+key1,key2,....如果新的字典相对

更新字典 (Updating a Dictionary,UVa12504)

题目描述: 解题思路: 1.根据:和,获得字符串 2.使用两个map进行比较: 1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <map> 5 using namespace std; 6 map<string, string>::iterator it; 7 map<string,string> dict[2]; 8 string