湖南生第八届大学生程序设计大赛原题 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;
}



原文地址:https://www.cnblogs.com/keanuyaoo/p/3343513.html