题目链接:点击打开链接
求增加减少改变的字典词
#include <iostream>
#include <stdio.h>
#include<cmath>
#include <map>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
string old,newdic;
string midkey,midvalue;
char prim[3]= {'+','-','*'};
struct node
{
string key,val;
int flag=0;
} str[1005];
vector<string> print0,print1,print2;
int main()
{
int n,i,j;
cin>>n;
while(n--)
{
print0.clear();
print1.clear();
print2.clear();
cin>>old;
cin>>newdic;
if(!newdic.empty()) newdic.erase(0,1);//去{
int sum=0;
while(!newdic.empty())//找到新字典的key,value的对应关系存到str数组里
{
midkey.clear();
i=0;
if(newdic[i]=='}')break;
while(newdic[i]!=':')
{
midkey.push_back(newdic[i]);
i++;
}
newdic.erase(0,i+1);
midvalue.clear();
i=0;
while(newdic[i]!=','&&newdic[i]!='}')
{
midvalue.push_back(newdic[i]);
i++;
}
newdic.erase(0,i+1);
str[sum].key=midkey;
str[sum].val=midvalue;
str[sum].flag=0;
sum++;
}
if(!old.empty())old.erase(0,1);//找到旧字典的key,value的对应关系存到str数组里
while(!old.empty())
{
midkey.clear();
i=0;
if(old[i]=='}')break;
while(old[i]!=':')
{
midkey.push_back(old[i]);
i++;
}
old.erase(0,i+1);
midvalue.clear();
i=0;
while(old[i]!=','&&old[i]!='}')
{
midvalue.push_back(old[i]);
i++;
}
old.erase(0,i+1);
int flag=1;
for(int j=0; j<sum; j++)
{
if(midkey==str[j].key)
{
if(midvalue!=str[j].val)
{
print2.push_back(midkey);//val值改变了
}
str[j].flag=1;
flag=0;
break;
}
}
if(flag==1)
print1.push_back(midkey);//减少de
}
for(int j=0; j<sum; j++)
{
if(str[j].flag==0)
print0.push_back(str[j].key);//增加的
}
if(print0.empty()&&print1.empty()&&print2.empty())
{
cout<<"No changes"<<endl;
if(n!=0)cout<<endl;
continue;
}
int lens0=print0.size();
int lens1=print1.size();
int lens2=print2.size();
sort(print1.begin(),print1.end());
sort(print0.begin(),print0.end());
sort(print2.begin(),print2.end());
if(!print0.empty())
{
cout<<"+";
for( j=0; j<print0.size()-1; j++)
{
cout<<print0[j]<<",";
}
cout<<print0[j]<<endl;
}
if(!print1.empty())
{
cout<<"-";
for( j=0; j<print1.size()-1; j++)
{
cout<<print1[j]<<",";
}
cout<<print1[j]<<endl;
}
if(!print2.empty())
{
cout<<"*";
for( j=0; j<print2.size()-1; j++)
{
cout<<print2[j]<<",";
}
cout<<print2[j]<<endl;
}
if(n!=0)cout<<endl;
}
return 0;
}
上面这个是去年写的,刚刚用map写了一下,map是按key排序的,所以就不用排序了
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
const int maxn=1e3+10;
void work(string &s,map<string,string>&m)
{
string s1,s2;
int i=1;
int len=s.size();
if(s[0]=='{'&&s[1]=='}')return;//判断字典是不是空集
while(i<len)
{
s1.clear();
for(; s[i]!=':'; i++)
s1.push_back(s[i]);
s2.clear();
for(i++; s[i]!=','&&s[i]!='}'; i++)
s2.push_back(s[i]);
i++;
m[s1]=s2;
}
}
int main()
{
int T,i,j;
string oldd,newd;
cin>>T;
while(T--)
{
map<string,string>m1,m2;
vector<string>add,de,change;
m1.clear();
m2.clear();
cin>>oldd;
work(oldd,m1);
cin>>newd;
work(newd,m2);
add.clear();
de.clear();
change.clear();
map<string,string>:: iterator it1,it2;
it1=m1.begin();
it2=m2.begin();
while(it1!=m1.end()&&it2!=m2.end())
{
if(it1->first==it2->first)
{
if(it1->second!=it2->second)
change.push_back(it1->first);
it1++,it2++;
}
else if(it1->first<it2->first)
{
de.push_back(it1->first);
it1++;
}
else
{
add.push_back(it2->first);
it2++;
}
}
while(it1!=m1.end())de.push_back(it1->first),it1++;
while(it2!=m2.end())add.push_back(it2->first),it2++;
if(add.size()==0&&de.size()==0&&change.size()==0)
cout<<"No changes"<<endl;
else
{
if(add.size()!=0)
{
sort(add.begin(),add.end());
cout<<"+";
for(i=0; i<add.size()-1; i++)
cout<<add[i]<<",";
cout<<add[i]<<endl;
}
if(de.size()!=0)
{
sort(de.begin(),de.end());
cout<<"-";
for(i=0; i<de.size()-1; i++)
cout<<de[i]<<",";
cout<<de[i]<<endl;
}
if(change.size()!=0)
{
cout<<"*";
sort(change.begin(),change.end());
for(i=0; i<change.size()-1; i++)
cout<<change[i]<<",";
cout<<change[i]<<endl;
}
}
cout<<endl;
}
}