• 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 << "]" << "
    ";
     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
    
    ");
    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
  • 相关阅读:
    windows系统切换jdk,修改java_home无效情况
    Cannot instantiate interface org.springframework.context.ApplicationListener
    MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)
    ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET
    EF TO MYSQL 无法查询中文的解决方法
    HttpWebRequest post请求获取webservice void数据信息
    This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分 解决方案
    MySQL 5.7.13解压版安装记录 mysql无法启动教程
    C# udpclient 发送数据断网后自动连接的方法
    汽车XX网站秒杀抢购代码
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/11074863.html
Copyright © 2020-2023  润新知