当前位置: 首页 > news >正文

12096 - The SetStack Computer (UVA)

题目链接如下:

Online Judge

这道题我一开始的思路大方向其实是对的,但细节怎么实现set到int的哈希没能想清楚(没想到这都能用map)。用set<string>的做法来做,测试数据小的话答案是对的,但大数据时间超时。

其实就是把所有set一一映射到int, 所以stack里每个元素就是int. 

按照刘汝佳思路写的代码如下(按理每个case里stack应该先清空,但因为题目保证了没有无效操作+只需要最上面set的元素个数,不清空也没问题):

#include <cstdio>
#include <set>
#include <stack>
#include <map>
#include <vector>
// #define debugint T, N, a, b;
std::map<std::set<int>, int> mp;
char op[10];
std::stack<int> s;
std::set<int> empty;
std::vector<std::set<int>> vec;void _push(std::set<int> st){if(!mp.count(st)){vec.push_back(st);mp[st] = vec.size() - 1;}s.push(mp[st]);
}int main(){#ifdef debugfreopen("0.txt", "r", stdin);freopen("1.txt", "w", stdout);#endifscanf("%d", &T);while(T--){scanf("%d", &N);vec.clear();mp.clear();while(N--){scanf("%s", op);if(op[0] == 'P'){_push(empty);} else{a = s.top();s.pop();if(op[0] == 'D'){s.push(a);s.push(a);} else{b = s.top();s.pop();std::set<int> tmp;if(op[0] == 'A'){tmp = vec[b];tmp.insert(a);} else{if(op[0] == 'U'){tmp = vec[a];for(auto it = vec[b].begin(); it != vec[b].end(); ++it){tmp.insert(*it);}} else if(op[0] == 'I'){for(auto it = vec[a].begin(); it != vec[a].end(); ++it){if(vec[b].find(*it) != vec[b].end()){tmp.insert(*it);}}}}_push(tmp);}}printf("%d\n", vec[s.top()].size());}printf("***\n");}#ifdef debugfclose(stdin);fclose(stdout);#endifreturn 0;
}

原先的代码如下(超时):

#include <cstdio>
#include <set>
#include <stack>
#include <string>
// #define debugint T, N;
char op[10];
std::stack<std::set<std::string>> s, empStack;
std::set<std::string> a, b, empty;std::string toString(std::set<std::string> st){std::string str = "{";for(auto it = st.begin(); it != st.end(); ++it){str += (it == st.begin() ? "" : ",");str += *it;}return str + "}";
}int main(){#ifdef debugfreopen("0.txt", "r", stdin);freopen("1.txt", "w", stdout);#endifscanf("%d", &T);while(T--){scanf("%d", &N);s.swap(empStack);while(N--){scanf("%s", op);if(op[0] == 'P'){s.push(empty);} else{a = s.top();s.pop();if(op[0] == 'D'){s.push(a);s.push(a);} else{b = s.top();s.pop();if(op[0] == 'A'){b.insert(toString(a));s.push(b);} else{if(op[0] == 'U'){for(auto it = a.begin(); it != a.end(); ++it){b.insert(*it);}s.push(b);} else if(op[0] == 'I'){std::set<std::string> intersect;for(auto it = a.begin(); it != a.end(); ++it){if(b.find(*it) != b.end()){intersect.insert(*it);}}s.push(intersect);}}}}printf("%d\n", s.top().size());}printf("***\n");}#ifdef debugfclose(stdin);fclose(stdout);#endifreturn 0;
}

http://www.lryc.cn/news/193671.html

相关文章:

  • Pygame中将鼠标形状设置为图片2-1
  • Vue3 + Nodejs 实战 ,文件上传项目--实现图片上传
  • linux C++ vscode连接mysql
  • [资源推荐]langchain、LLM相关
  • hdfs笔记
  • java_方法引用和构造器引用
  • Flink Log4j 2.x使用Filter过滤日志类型
  • Ubuntu下怎么配置vsftpd
  • 链表(7.27)
  • 在 Elasticsearch 中实现自动完成功能 1:Prefix queries
  • 『PyQt5-Qt Designer篇』| 13 Qt Designer中如何给工具添加菜单和工具栏?
  • Android Studio新建项目教程
  • 前端页面布局之【响应式布局】
  • 定制排序小案例
  • 如何设计一个ToC的弹窗
  • Idea执行Pom.xml导入jar包提示sun.misc.BASE64Encoder jar找不到---SpringCloud工作笔记197
  • 大数据面试题:Spark和Flink的区别
  • 2023年9月青少年软件编程(C 语言) 等级考试试卷(二级)
  • 【Wifi】Wifi架构介绍
  • 攻防世界数据逆向 2023
  • 分布式链路追踪如何跨线程
  • 怎样在线修剪音频文件了?【免费,无须注册】
  • iMeta框架使用方法
  • 视频编辑软件 Premiere Pro 2024 macv24.0中文版 (pr2024)
  • C/C++:双向队列的实现
  • MySQL逻辑架构
  • python爬虫练手项目之获取某地企业名录
  • Python —— 接口自动化(1)
  • 【MySQL】关于MySQL升级到8.0版本的实践方案
  • 【Python-Django】基于TF-IDF算法的医疗推荐系统复现过程