zoukankan      html  css  js  c++  java
  • 湖南生第八届大学生程序设计大赛原题 C-Updating a Dictionary(UVA12504

    UVA12504 - Updating a Dictionary


    给出两个字符串,以相同的格式表示原字典和更新后的字典。要求找出新字典和旧字典的不同,以规定的格式输出。


    算法操作:

    (1)处理旧字典,将旧字典中的每对关键字及其价值从字典串中截取出来,压入容器中。用做新旧字典对比检索。

    (2)处理新字典,将新字典中的每对关键字及其价值从字典串中截取出来。对于每个关键字,在容器中检索相同的关键字。若检索不成功,该关键字是新字典新增的,处理存储到相关的串数组中。若检索成功,提取容器中该关键字的价值与新字典中该关键字的价值对比,若值相同,该关键之没有改变,不予处理;若价值不同,处理存储到相关的串数组中。对于检索成功的关键字,处理完后立即将其从容器中删除,以免影响后续操作。

    (3)处理容器中剩下的关键字及其价值。新字典处理完后,容器中剩余的都是旧字典更新后删除的关键字。提取容器中所有剩余关键字,并将其处理存储到相关串数组中。

    (4)对处理所得结果【关键字及其价值变化后存储的数组】进行判断输出。完全没有变化,输出“No changes”;否则,按照题目要求的格式输出相关变化值。


    难点:

    (1)截取关键字及其价值的操作,字符串综合应用(*****)

    (2)处理新字典中关键字和旧字典中关键字的操作【关键删除和价值不同的变化】,容器的基本应用(**)

    (3)处理旧字典中删除的关键字的操作【map容器方法的应用】,容器的高级应用(***)

    (4)输出格式,逗号隔开(*)


    易错点:

    (1)关键字及其价值截取长度,截取的起始位置和终止位置

    (2)关键字的价值的长度可能大于20,__int64存储可能会溢出,要用字符串存储

    (3)空字典—>非空字典,非空字典—>空字典  的转换,不予处理会出错

    (4)输出格式,中间有逗号,最后有空行


    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<cstdio>
    #include<map>
    
    using namespace std;
    
    int main()
    {
        //freopen("in.txt","r",stdin);
    
        string str1,str2;
        int add1,d,m;  // <增加的,减少的,价值变化的>关键字的个数
        string ad[102],decr[102],mul[102];  // 存储<增加的,减少的,价值变化的>关键字
    
        int t;
        cin>>t;   //t组数据
        while(t--)
        {
            map<string,string> ma; //主要查找索引的容器
    
            cin>>str1>>str2;  //输入两个“字典”
    
            add1=0;   //初始化为0,表示都还没有
            d=0;
            m=0;
    
            int a=0;  //截取检索的起始位置为0
    
            while(str1.find(',',a+1)<str1.size())  //当串中没有逗号的时候结束【截取关键字和其价值】
            {
                string s(str1,a+1,str1.find(',',a+1)-a-1);  //截取到一组关键字及其价值【上一个逗号到下一个逗号之间】
    
                string x(s,0,s.find(':',0));
                string y(s,s.find(':',0)+1,s.size()-s.find(':',0));  //分离一组关键字及其价值【分号为分割符】
    
                ma.insert(pair<string,string>(x,y));  //把关键字及其价值作为一组索引,插入到容器map中
    
                a=str1.find(',',a+1);  //下组关键字截取的起始位置,从本组关键字截取的末尾位置后面的逗号的下一个字符开始
            }
    
            string s(str1,a+1,str1.find('}',a+1)-a-1);   //逗号为界的已经截取完,最后一组数据,截取标志是【右大括号】
    
            string x(s,0,s.find(':',0));
            string y(s,s.find(':',0)+1,s.size()-s.find(':',0));
    
            if(x.size()!=0) ma.insert(pair<string,string>(x,y));  //若最后一组是【空】,该字典为空字典,截取的空字符串不予处理
    
            a=0;
            while(str2.find(',',a+1)<str2.size())
            {
                string s(str2,a+1,str2.find(',',a+1)-a-1);
    
                string x(s,0,s.find(':',0));
                string y(s,s.find(':',0)+1,s.size()-s.find(':',0));
    
                if(ma.find(x)==ma.end())ad[add1++]=x;   //在容器map中检索不到关键字x,x是新加进来的,更新【增加的关键字的串数组(添加)】
                else   //在map中检索到该关键字
                {
                    string temp=ma.find(x)->second;  //取出容器中该关键字对应的价值
                    if(temp!=y)mul[m++]=x;  //价值不同,改变【价值变化关键字的串数组(增加)】
                    ma.erase(x);  //检索应用过的,直接删除,免得影响后面的操作
                }
                a=str2.find(',',a+1);
            }
    
            string s1(str2,a+1,str2.find('}',a+1)-a-1);
    
            string x1(s1,0,s1.find(':',0));
            string y1(s1,s1.find(':',0)+1,s1.size()-s1.find(':',0));
    
            if(x1.size()!=0)  //【第二个字典是空字典】
            {
                if(ma.find(x1)==ma.end())ad[add1++]=x1;
                else
                {
                    string temp=ma.find(x1)->second;
                    if(temp!=y1)mul[m++]=x1;
                    ma.erase(x1);
                }
    
            }
    
            while(ma.begin()!=ma.end())   //处理两个字典对照后,容器中的关键字【第一个字典更新后,删掉的关键字】
            {
                string temp=ma.begin()->first;
                decr[d++]=temp;
                ma.erase(temp);//处理过的就删除,知道容器为空,处理结束
            }
    
            if(add1==0&&d==0&&m==0)cout<<"No changes"<<endl;   //关键字变化的总个数为0【字典更新后没有变化】
    
            else
            {
                if(add1!=0)  //字典跟新后,关键字有增加
                {
                    sort(ad,ad+add1);
                    cout<<"+";
                    for(int i=0;i<add1;i++)
                    {
                        if(i!=0)cout<<",";
                        cout<<ad[i];
                    }
                    cout<<endl;
                }
    
                if(d!=0)   //字典更新后,关键字减少
                {
                    sort(decr,decr+d);
                    cout<<"-";
                    for(int i=0;i<d;i++)
                    {
                        if(i!=0)cout<<",";
                        cout<<decr[i];
                    }
                    cout<<endl;
                }
    
                if(m!=0)   //字典更新后,有关键字的价值变化
                {
                    sort(mul,mul+m);
                    cout<<"*";
                    for(int i=0;i<m;i++)
                    {
                        if(i!=0)cout<<",";
                        cout<<mul[i];
                    }
                    cout<<endl;
                }
            }
    
            cout<<endl;
        }
        return 0;
    }
    



  • 相关阅读:
    Blob格式数据处理以及DataTable问题处理
    JavaScript 与 jQuery-简记
    JFinal-学习笔记(下)
    JFinal学习笔记
    工作记录
    读书笔记——计算机科学导论
    面试经验大全
    如何在liunx系统发布项目
    面试必备
    最全面的测试用例
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3343513.html
Copyright © 2011-2022 走看看