UVa12096 set map vector stack的综合运用

来源:互联网 发布:2017东南大学软件学院 编辑:程序博客网 时间:2024/04/30 13:58
UVa12096
#include<cstdio>#include<cstring>#include<iostream>#include<sstream>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<set>#include<map>using namespace std;typedef set<int> Set;//set<int>表示含有集合的集合,如{ {},{} }表示为<1,1>map<Set,int> idMap;//将集合映射成idvector<Set> diffSet;//保存每一个不同的集合对应的Set,下标是idstack<int> stk;//保存集合对应的id,由diffSet[id]得到Setint findID(Set x){    if(idMap.count(x)>0) return idMap[x];    diffSet.push_back(x);    int id=diffSet.size()-1;    idMap[x]=id;    return id;}int main(){    int t,n;    char cmd[10];    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        while(n--)        {            scanf("%s",cmd);            if(cmd[0]=='P')                stk.push( findID(Set()) );            else if(cmd[0]=='D')                stk.push(stk.top());            else{                Set x1=diffSet[stk.top()];stk.pop();                Set x2=diffSet[stk.top()];stk.pop();                Set x;                if(cmd[0]=='U')                    set_union(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin()) );                else if(cmd[0]=='I')                    set_intersection(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin()) );                else if(cmd[0]=='A'){                    x=x2;                    x.insert(findID(x1));                }                stk.push(findID(x));            }            printf("%d\n",diffSet[stk.top()].size());        }        printf("***\n");    }    return 0;}

0 0
原创粉丝点击