首页 > 其他 > 详细

uva12096 The SteStack Computer

时间:2017-01-14 13:40:31      阅读:250      评论:0      收藏:0      [点我收藏+]

很久没写博客了,今天终于回来了,没错我就是成绩不咋地noip考的很渣的zhcnyuyang。

今天要讲的是uva第12096题,题意大家也都清楚。本题特殊的地方在于,本题中的集合里的元素不是数字,不是字符,而是集合。所以要用到map类(需要导入map头文件,即在程序开头出写上#include<map>),让每一个集合都对应一个int数字。为什么要这样做呢。比方说你有一个集合,里边有俩元素,一个是空集,一个里边还套着一个集合,那你怎么办?是把这个集合定义为set<set<int>>还是set<set<set<int>>>啊?所以莫不如让每个集合都对应一个数字,当你要把一个集合添加到另一个集合里时,直接把它对应的数字添加进去就行了,像这样:

//把集合s2添加到s1中
set<int>  s1;
set<int> s2;
map<set<int>,int> m;
m[s2]=1;
s1.insert(m[s2]);

每个集合对应的整数值可以任意赋值。但值得注意的是,集合在m中对应的数字,取决于集合的值。比方说如果s1和s2的值相等,那么m[s1]和m[s2]就也相等,如果s1的值发生了改变,那么s1的值改变前后所对应的值也不一样。

比如现在有一个栈

{{}}//s2

{}//s1

现在用DUP将栈顶元素复制一份后入栈,变成了

{{}}//s3

{{}}//s2

{}//s1

这时s3和s2的值是一样的,所以s2和s3对应的数值也是相等的。现在定义一个map类型数组

map<set<int>,int> m;

则m[s2]与m[s3]是相等的。而s1由于值与s2不相等,所以m[s1]与m[s2]不相等。

现在输入DUP命令,栈中元素为

{{},{{}}}//s2

{}//s1

这时m[s2]的值与操作前m[s2]的值不相等。

因此,当出现一个新集合,或者改变原有集合的值时,一定要看map数组中是否有与新集合或集合的新值相等的元素,如果没有,再给新集合或集合新值在map数组中对应的数字赋新值。

上代码:

/*
    Name: uva12096-The SetStack Computer
    Copyright: 
    Author: yuyang
    Date: 08/01/17 13:55
    Description: 
*/

#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<set>
#include<map>
#include<cstring>
#include<string>
#include<stack>
using namespace std;
typedef set<int> Set;
typedef map<set<int>,int> Map;
typedef stack<set<int> > Stack;

int t,n,num;
string op;
Map mp;
Set st,st2,emptyst;
Stack stk;

void clear(){
    while(!stk.empty()){
        stk.pop();
    }
}

void output(){
    Set s=stk.top();
    cout<<s.size()<<"\n";
}

void push(){
    Set sst;
    //mp[sst]=++num;
    stk.push(sst);
    output();
}

void dup(){
    st=stk.top();
    stk.push(st);
    output();
}

void Union(){
    st=stk.top();
    stk.pop();
    st2=stk.top();
    stk.pop();
    Set st3=st2;
    for(set<int>::iterator i=st.begin();i!=st.end();i++){
        st3.insert(*i);
    }
    if(st2.empty()){
        stk.push(st);
    }else if(st.empty()){
        stk.push(st2);
    }else{
        mp[st3]=++num;
        stk.push(st3);
    }
    output();
}

void intersect(){
    st=stk.top();
    stk.pop();
    st2=stk.top();
    stk.pop();
    Set st3;
    mp[st3]=++num;
    for(set<int>::iterator i=st.begin();i!=st.end();i++){
        if(st2.count(*i)!=0){
            st3.insert(*i);
        }
    }
    if(st3==st){
        stk.push(st);
    }else if(st3==st2){
        stk.push(st2);
    }else{
        if(!mp.find(st3)){
        mp[st3]=++num;
    }
        stk.push(st3);
    }
    output();
}

void add(){
    st=stk.top();
    stk.pop();
    st2=stk.top();
    stk.pop();
    st2.insert(mp[st]);
    if(!mp.find(st2)){
        mp[st2]=++num;
    }
    stk.push(st2);
    output();
}

int main(){
    freopen("uva12096in.txt","r",stdin); 
    cin>>t;
    mp[emptyst]=-1;//空集对应的数值为-1 
    for(int i=1;i<=t;i++){
        num=0;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>op;
            if(op=="PUSH"){
                push();
            }else if(op=="DUP"){
                dup();
            }else if(op=="UNION"){
                Union();
            }else if(op=="INTERSECT"){
                intersect();
            }else if(op=="ADD"){
                add();
            }
        }
        cout<<"***\n";
        clear();
    }
    return 0;
}

 

uva12096 The SteStack Computer

原文:http://www.cnblogs.com/zhcnyuyang/p/6263193.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!