http://acm.hdu.edu.cn/showproblem.php?pid=5929

题意:一个只有0和1的双端队列,可以入栈,出栈,反转,求值(从现在的栈顶一直与非到栈底)

可能有20w次的操作,emmm菜逼挠了挠头感觉肯定有什么规律。奈何太菜没有发现,硬算一波果然超时.....只能去网上找大佬的代码看...

只需要记录两端最靠边的0的位置就好了,也就是两端连续的1的个数,因为从栈顶到最接近栈底的0之间的不管是什么,只要有东西(0不在栈顶),和那个0与非最后与非那个0得到的都是1,再根据这个0后面有几个连续的1就可以知道最后结果了

但是会有几种情况:

  • 没有0(都是1或者空的)(入栈的时候如果入1)
  • 只有一个0(两端最靠边的0是同一个)
  • 两个0(各是各的)
  • 只有一个0而且在某端点

每种情况入栈的时候会不同,具体看注释吧。出栈的时候维护好记录0位置(连续1的个数)的标志就好了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int T,I=1;
 6     scanf("%d",&T);
 7     while(T--)
 8     {
 9         printf("Case #%d:\n",I++);
10         int Y;
11         bool fa = 1,ze = 0;//fa是栈是否反转的标志,ze是栈中是否有0的标志
12         int t=0,w=0;//w表示栈为正(fa==1)的时候的栈底有几个连续的1,t表示栈为反(fa==0)时栈底有几个连续的1
13         deque<bool> de;//双端队列,啊真好用2333
14         scanf("%d",&Y);
15         char str[20];//存指令
16         while(Y--)
17         {
18             getchar();
19             scanf("%[^\n]",str);//读一整行到str中
20             switch(str[2])//通过指令的第三个字符判断
21             {
22             case 'S'://入栈
23                 if(fa)//没反转
24                 {
25                     de.push_front(str[5]=='1');//将数字入栈
26                     if(str[5]=='1')//如果入的是1的话t++
27                         t++;
28                     else
29                         t=0,ze=1;//如果入的是0,把t置零,ze置1
30                     if(!ze)w++;//如果入这个数字的时候栈里没有0(入的这个肯定是1),w也要++,因为如果栈里没有0那w和t就是长度
31                 }
32                 else//反转
33                 {
34                     de.push_back(str[5]=='1');
35                     if(str[5]=='1')
36                         w++;
37                     else
38                         w=0,ze=1;
39                     if(!ze)t++;
40                 }
41                 break;
42             case 'E'://求值
43                 if(!de.size())//栈空的话
44                     printf("Invalid.\n");
45                 else//非空的话
46                 {
47                     //偶数为0,奇数为1,0的时候也为1,w=0;w=size();w在中间
48                     int tem = fa==1?w:t;
49                     if(tem==0)//如果栈底没有连续1
50                         if(de.size()!=1)printf("1\n");//如果不是只有一个0的话结果肯定是1
51                         else
52                             printf("0\n");//如果栈里只有一个0的话结果就是0
53                     else if(tem==de.size()||tem==de.size()-1)//如果栈里没有0或者0在栈顶的话
54                         printf("%d\n",tem%2);
55                     else//如果0在中间(上面说的第三种情况)可以吧0看做1
56                         printf("%d\n",(tem+1)%2);
57                 }
58                 break;
59             case 'V'://反转
60                 fa=!fa;
61                 break;
62             case 'P'://出栈
63                 if(fa)
64                 {
65                     de.pop_front();
66                     t--;
67                     if(t<0)//没有刚刚出掉了个0要重新找离栈底最近的0(相当于求连续1的个数)
68                         for(t=0; t<de.size()&&de[t]!=false; t++);
69                     if(t==de.size())//没找到,说明栈里没有0
70                         ze=0;
71                 }
72                 else
73                 {
74                     de.pop_back();
75                     w--;
76                     int i=0;
77                     if(w<0)//没有刚刚出掉了个0要重新找离栈底最近的0(相当于求连续1的个数)
78                         for(w=de.size(); w>0&&de[w-1]!=false; w--,i++);
79                     if(w==0)//没找到,说明栈里没有0
80                         ze=0,w=i;
81                 }
82                 break;
83             }
84         }
85     }
86     return 0;
87 }

转载于:https://www.cnblogs.com/icfir/p/9022563.html

hud 5929.Basic Data Structure相关推荐

  1. 【推导】【线段树】hdu5929 Basic Data Structure

    题意: 维护一个栈,支持以下操作: 从当前栈顶加入一个0或者1: 从当前栈顶弹掉一个数: 将栈顶指针和栈底指针交换: 询问a[top] nand a[top-1] nand ... nand a[bo ...

  2. TRIE - Data Structure

    Introduction 介绍 Trie,又称单词查找树,是一种树形结构,用于保存大量的字符串.它的优点是:利用字符串的公共前缀来节约存储空间. Trie is an ordered tree dat ...

  3. 【HDU - 4217 】Data Structure? (线段树求第k小数)

    题干: Data structure is one of the basic skills for Computer Science students, which is a particular w ...

  4. Data Structure

    Data Structure 1. Abstract Data Type (ADT) 1.1. Data type A set of objects + a set of operations Exa ...

  5. SAP RETAIL初阶MM41创建商品主数据BASIC DATA里的Valuation Class

    SAP RETAIL初阶MM41创建商品主数据BASIC DATA里的Valuation Class 执行事务代码MM41,创建一个Single Material的物料. 物料类型 FOOD 物料组: ...

  6. SAP RETAIL商品主数据Basic Data视图里几个让人莫名惊诧的字段

    SAP RETAIL商品主数据Basic Data视图里几个让人莫名惊诧的字段 刚刚接触SAP零售系统,笔者对于商品主数据的界面,很多不适应,不熟悉. 所以笔者在闲暇之余,没事就喜欢在SAP零售系统上 ...

  7. SAP LSMW 物料主数据Basic Data Text数据的导入

    SAP LSMW 物料主数据Basic Data Text数据的导入 笔者所在的D项目上,业务要求每个物料主数据能有一个remark字段,用以在物料描述之外为物料做更多更详细的描述,比如一些备品备件物 ...

  8. LeetCode Two Sum III - Data structure design

    原题链接在这里:https://leetcode.com/problems/two-sum-iii-data-structure-design/ 题目: Design and implement a ...

  9. leetcode 211. Add and Search Word - Data structure design Trie树

    题目链接 写一个数据结构, 支持两种操作. 加入一个字符串, 查找一个字符串是否存在.查找的时候, '.'可以代表任意一个字符. 显然是Trie树, 添加就是正常的添加, 查找的时候只要dfs查找就可 ...

最新文章

  1. 1048 数字加密 (20 分)java
  2. c#_未将对象引用设置到对象的实例
  3. 不管工作压力太大了,还是工作压力太小了;都容易引起开发人员的辞职风波...
  4. 连接数_全国建成5G基站超48万个 5G终端连接数已过亿
  5. Redis 实践笔记1---基础知识
  6. python代码性能分析_使用memory_profiler对代码进行性能分析会增加执行时间
  7. 基于智能手机Android平台音乐播放器全程开发实战
  8. 创建数据库python: can‘t open file ‘manage.py‘: [Errno 2] No such file or directory报错
  9. Apache Solr Velocity 注入远程命令执行漏洞复现 (CVE-2019-17558)
  10. Telnet 1433端口
  11. 6-4cifar10数据介绍读取处理(下)
  12. bzoj5017 [Snoi2017]炸弹
  13. 查看详细_教师资格准考证开始打印!点击查看详细流程!
  14. cad立面索引符号 规范_cad立面索引符号怎么画
  15. VMware安装windows7x64时提示找不到CD/DVD驱动器
  16. YNOI板刷计划记录
  17. 做自媒体,学视频剪辑须知的四大宝藏网站
  18. Flex布局脑图总结
  19. ios面试题 看了就知道哪方面需要加强上机练习
  20. kali安装中文输入法(搜狗输入法)

热门文章

  1. angularJS学习笔记一
  2. 项目管理知识框架PMBOK(文字版)
  3. 好久没写blog了。最近感觉自己老了
  4. java中file类_Java中file类
  5. nginx启动只有master没有worker_深入浅出Nginx
  6. python编程入门单例_常见的在Python中实现单例模式的三种方法
  7. php 获取对象中的元素个数组长度,php数组长度怎么获取
  8. 位宽512bit显卡_显卡知识:关于显卡位宽的基础知识科普
  9. C#中统计程序运行时间
  10. python batch normalization_Batch Normalization 引出的一系列问题