• The SetStack Computer UVA


    题意:初始状态的栈内包含一个空集,对栈进行一下操作:

    PUSH:向栈内压入一个空集

    DUP:复制栈顶,并压入栈内

    UNION:将栈顶端两个集合出栈,并将两个元素的并集入栈

    INTERSECT:将栈顶端两个集合出栈,并将两个元素的交集入栈

    ADD:将栈顶端两个集合出栈,将先出栈元素加入后出栈元素的集合中,而后入栈

    对于每次操作,输出栈顶集合的元素数。

    思路:声明一个栈st用来存放集合,声明多个堆用于表示集合,声明映射<set,int>表示集合编号,对于每次待入栈的集合进行编号查找工作,若已经有编号就将该编号入栈,否则赋予该集合一个编号,而后入栈。

    对于并集操作使用:set_union()进行求解

    对于交集操作使用:set_intersection()进行求解

    #include<bits/stdc++.h>
    using namespace std;
    #define LL long long
    #define INF 999999999
    
    typedef set<int> Set;
    map<Set,int>Map;
    stack<int> st;
    vector<Set> v;
    
    int Find(Set s)
    {
        if(Map.count(s))
            return Map[s];
        v.push_back(s);
        return Map[s] = v.size()-1;
    }
    
    int main()
    {
        int T,n;
        cin >> T;
        string s;
        while(T--)
        {
            cin >> n;
            Map.clear();
            v.clear();
            while(!st.empty())
                st.pop();
            for(int i=1;i<=n;i++)
            {
                cin >> s;
                if(s[0] == 'P')
                {
                    st.push(Find(Set()));
                }
                else if(s[0]=='D')
                {
                    st.push(st.top());
                }
                else
                {
                    Set s1 = v[st.top()];
                    st.pop();
                    Set s2 = v[st.top()];
                    st.pop();
                    Set temp;
                    if(s[0]=='U')
                    {
                        set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(temp,temp.begin()));
                    }
                    else if(s[0]=='I')
                    {
                        set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(temp,temp.begin()));
                    }
                    else if(s[0]=='A')
                    {
                        temp = s2;
                        temp.insert(Find(s1));
                    }
                    st.push(Find(temp));
                }
                cout << v[st.top()].size() << endl;
            }
            cout << "***" << endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    git的基本使用流程
    进程号和端口的互查
    find: missing argument to `-exec'
    mysql 排除系统库的全部备份
    windows添加“以管理员身份运行”
    sftp服务器的搭建
    ubuntu的sudo免密
    深入理解Java:注解(Annotation)自定义注解入门
    MySQL常见的三种存储引擎
    Intellij Idea 2017 字体模糊解决方案
  • 原文地址:https://www.cnblogs.com/alan-W/p/10776462.html
Copyright © 2020-2023  润新知