CDOJ-10(栈的应用)

In Galgame We Trust

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

As we all know, there are many interesting (H) games in kennethsnow’s computer. But he sets a password for those games. Zplinti1 wants to crack his password and play those games.

Kennethsnow uses only 6 kinds of characters to form his password:

  1. brackets: ( and )
  2. square brackets: [ and ]
  3. curly brackets: { and }

Kennethsnow’s password must be a correct bracket sequence, and will not be empty.

Zplinti1 found a string written by kennethsnow, and he is sure that kennethsnow’s password is a substring of that, he wonders the maximum possible length of his password, or if his judgment is wrong.

Please note that the original string may also be the password.

Input

The first line of input contains a number T, indicating the number of test cases. (T≤30) For each case, there is a string s, which is the string zplinti1 found. (1≤|s|≤1,000,000, the string will contain those 6 kinds of characters only)

Output

For each case, output Case #i: first. (i is the number of the test case, from 1 to T). If zplinti1’s judgment is wrong (i.e. the answer is 0), output I think H is wrong!, otherwise output a single number, indicating the maximum possible length of kennethsnow’s password.

Sample input and output

Sample Input Sample Output
3
(){[]}
{([(])}
))[{}]]
Case #1: 6
Case #2: I think H is wrong!
Case #3: 4

分析:括号匹配,把左括号依次入栈,如果碰到右括号,就与栈顶的元素匹配。用now表示当前的长度,tmp表示连续匹配成功的括号长度。具体看代码。

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <ctime>
 5 #include <iostream>
 6 #include <algorithm>
 7 #include <set>
 8 #include <vector>
 9 #include <sstream>
10 #include <queue>
11 #include <typeinfo>
12 #include <fstream>
13 #include <map>
14 #include <stack>
15 using namespace std;
16 #define INF 100000
17 typedef long long ll;
18 const int maxn=1000010;
19 char s[maxn];
20 bool match(char s1,char s2){
21     if(s1==‘(‘&&s2==‘)‘) return true;
22     if(s1==‘[‘&&s2==‘]‘) return true;
23     if(s1==‘{‘&&s2==‘}‘) return true;
24     return false;
25 }
26 int main()
27 {
28     int t,times=1;
29     scanf("%d",&t);
30     while(t--){
31         memset(s,0,sizeof(s));
32         scanf("%s",s);
33         stack<char> p;
34         int len=strlen(s),lens=0,tmp=0,now=0;
35         for(int i=0;i<len;i++){
36             if(s[i]==‘(‘||s[i]==‘{‘||s[i]==‘[‘)
37                 p.push(s[i]);
38             else{
39                 if(!p.empty()) {
40                     char top=p.top();
41                     if(match(top,s[i])){
42                         p.pop();
43                         tmp+=2;
44                         if(p.empty()){    //如果之前的都匹配完了,则更新now
45                             now+=tmp;
46                             lens=max(lens,now);
47                             tmp=0;
48                         }
49                     }
50                     else{
51                         while(!p.empty()) p.pop();  //匹配不成功,则把之前的都清空。
52                         lens=max(lens,tmp);  //之前的有没匹配成功的,所以不用更新now。
53                         tmp=0;
54                         now=0;
55                     }
56                 }
57                 else{
58                     now+=tmp;
59                     lens=max(lens,now);
60                     tmp=0;
61                     now=0;
62                 }
63             }
64         }
65         printf("Case #%d: ",times++);
66         if(lens!=0) printf("%d\n",lens);
67         else printf("I think H is wrong!\n");
68     }
69     return 0;
70 }
时间: 2024-10-12 12:14:03

CDOJ-10(栈的应用)的相关文章

UESTC_In Galgame We Trust CDOJ 10

As we all know, there are many interesting (H) games in kennethsnow’s computer. But he sets a password for those games. Zplinti1 wants to crack his password and play those games. Kennethsnow uses only 6 kinds of characters to form his password: brack

C#堆与栈

解释1.栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义:堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小 解释2. 存放在栈中时要管存储顺序,保持着先进后出的原则,他是一片连续的内存域,有系统自动分配和维护. 而堆是无序的,他是一片不连续的内存域,有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收. 引用类型总是存放在堆中. 值类型和指针总是放在它们被声明的地方. 调用方法:系统先将

(数组)Largest Rectangle in Histogram(栈解问题)

Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. Above is a histogram where width of each bar is 1, given heigh

栈初始化,入栈,出栈功能的实现

1 ////////////////////////////////////////////////////////// 2 // stack.cpp 3 // 4 // author:Leetao 5 ////////////////////////////////////////////////////////// 6 // 简介: 7 // 线性表的实现 8 ////////////////////////////////////////////////////////// 9 /** 1

浅谈c语言程序为什么需要内存 栈又是什么?

1 1.关于内存(程序的执行需要内存的支持) 2 (1)内存本身在物理上是硬件器件,由操作系统提供 3 (2)内存的管理最终由操作系统统一管理.为了能过便捷的管理内存(酒店管理房间 是不是分很多不同的类型和待遇呢),同样操作系统提供了多种的机制来让了多种机制来让我们应用程序使用内存.这些机制彼此不同,各自有各自的特点,我们程序根据自己的实际情况来选择某种方式获取内存(在操作系统处登记这块内存的临时使用权限).使用内存.释放内存(向操作系统归还这块内存的使用权限).也就是在进入酒店拿到钥匙或者卡,

Java数据结构与算法(第四章栈和队列)

本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构(链表.树等等)一样,都适用于数据应用中作数据记录. 然而,本章要讲解的是数据结构和算法更多的是作为程序员的工具来运用.它们组要作为构思算法的辅助工具,而不是完全的数据存储工具.这些数据结构的生命周期比那些数据库类型的结构要短的多.在程序操作执行期间它们才被创建,通常它们去执行某项特殊的任务,当完成之后,它们就被销毁. 受限访问 在数组中,只要知道下标就可以访问数据项.或顺

栈的基本操作 出栈与入栈

#include<stdio.h> #include<stdlib.h> #define LENGTH 100 //初始分配栈的长度 #define ADD_LEN 10 //栈长增量 typedef struct {//构造栈的数据类型 int *base; int *top; int stacksize; }SqStack; void CreateStack(SqStack &S);//初始化一个栈 void PushStack(SqStack &S,int e

算法系列15天速成——第十天 栈

原文:算法系列15天速成--第十天 栈 今天跟大家聊聊栈,在程序设计中,栈的使用还是非常广泛的,比如有“括号匹配问题“,”html结构匹配问题“. 所以说掌握了”栈“的使用,对我们学习算法还是很有帮助的. 一: 概念 栈,同样是一种特殊的线性表,是一种Last In First Out(LIFO)的形式,现实中有很多这样的例子, 比如:食堂中的一叠盘子,我们只能从顶端一个一个的取. 二:存储结构 ”栈“不像”队列“,需要两个指针来维护,栈只需要一个指针就够了,这得益于栈是一种一端受限的线性表.

leetcode栈--2、largest-rectangle-in-histogram(直方图最大面积)

题目描述 Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. Above is a histogram where width of each bar is 1, given height =[2,1,5,6,2,3]. The larg

用栈结构实现多项式计算器

学校数据结构课程实验之一. 用到的数据结构:栈 基本功能: 输入中缀的运算表达式(即运算符在操作数中间,符合日常的书写习惯),将其转为逆波兰表达式(后缀表达式,适于机器运算): 对输入的表达式进行括号匹配检查,若不符合规则,报错:对于符合规则的表达式,计算结果并输出: 过滤输入的非法字符(字母). 概要设计: 主函数代码(main.cpp): 1 #include <iostream> 2 #include "MyStack.cpp" 3 #include "Ca