UVA 12504 Updating a Dictionary

Topic links: https://vjudge.net/problem/UVA-12504

Title translation from "classical algorithm banned entry"

Subject to the effect

  In this problem, several dictionaries are key-value pairs, where the key is a string of lower-case letters, the value of non-negative integers with no leading zero or a positive number (-4,03 and +77 are illegal, note that integer may great). Enter an old dictionary and a new dictionary, calculate the change between the two. Two dictionaries input keys are unique, but any arrangement order.

  Input consists of two lines, each containing no more than 100 characters, that old dictionaries and new dictionary. Output format is as follows:

  1. If at least one additional key, print a "+" sign, then all the new keys, according to the dictionary order from small to large order.
  2. If there is at least a delete key, print a "-" sign, then all the delete key, press the lexicographically smallest to largest.
  3. If at least one modifier key, prints a "*" sign, and then all of a modifier key, press the lexicographically smallest to largest.
  4. Without any changes, output No changes.

analysis

  Engage in two tables-one comparisons can be ordered.

code show as below

  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());22deleting all x c//
 #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 }
View Code

 

Guess you like

Origin www.cnblogs.com/zaq19970105/p/11074863.html