题目笔记 UVA12096

  一道综合set,map,stack的STL题目,非常有意思!!(当然确实有一点绕)

 

 

UVA12096  AC码

#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<cstring>
#include<set>
#include<stack>
using namespace std;

int n,m;
typedef set<int> jihe;//栈(sta)里存的都是int,而int所代表的集合里也是int
map<jihe,int> quanzhi;
vector<jihe>idinsetout;
stack<int>sta;//栈(sta)里存的都是int(表示集合),因为是集合套集合所以集合里也是int(表示另一集合)


#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())

int setinidout(jihe c)
{
    if(quanzhi.count(c)) return quanzhi[c];//之前写的是:idinsetout.count(c),被绕晕了
    idinsetout.push_back(c);           //(第一次忘了这个)在vector里新加上一个
    return quanzhi[c]=idinsetout.size()-1;//他的角标就是他的权值(这两步新建集合)
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>m;
        for(int j=1;j<=m;j++)
        {
            string s;
            cin>>s;
            if(s[0]=='P') sta.push(setinidout(jihe()));//这里jihe()
            else if(s[0]=='D') sta.push(sta.top());//stack和vector的push操作有区别
            else
            {
                jihe a=idinsetout[sta.top()];
                sta.pop();
                jihe b=idinsetout[sta.top()];
                sta.pop();
                jihe x;
                if(s[0]=='U') set_union (ALL(a),ALL(b),INS(x));
                if(s[0]=='I') set_intersection (ALL(a),ALL(b),INS(x));
                if(s[0]=='A') {x=b;x.insert(setinidout(a));}
                sta.push(setinidout(x));
            }
            cout<<idinsetout[sta.top()].size()<<endl;
        }
        cout<<"***"<<endl;
    }
}

 

 

 

 

很多要注意的点

 

上一篇:郑厂长系列故事——排兵布阵(HDU-4539)(状压DP)


下一篇:207. 课程表