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:
- If at least one additional key, print a "+" sign, then all the new keys, according to the dictionary order from small to large order.
- If there is at least a delete key, print a "-" sign, then all the delete key, press the lexicographically smallest to largest.
- If at least one modifier key, prints a "*" sign, and then all of a modifier key, press the lexicographically smallest to largest.
- Without any changes, output No changes.
analysis
Engage in two tables-one comparisons can be ordered.
code show as below
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }