#587. 天天和不可描述

【题目描述】:

天天和()是好朋友,然而总是唱反调。对于一个有() 的字符串,天天总是会把()内的所有东西都倒过来读。

比如对于字符串abc(def) ,天天看到的就是abcfed 。

括号里面可能是空的,也有可能套有多个括号,比如说abc(hello)(world)lcy()x(owq(zrt)),天天看到的就是abcollehdlrowlcyxzrtqwo 。

因为(owq(zrt))首先变成了(trz)qwo ,接下来变成了zrtqwo ,zrt 被反转了两次,所以天天看到的还是zrt。

现在给你一个字符串,问你天天看到的是什么样子的?

【输入描述】:

一行一个字符串,表示原始的字符串。保证字符串内只有小写字母和(以及)组成。保证括号总是配对的。

【输出描述】:

一行一个字符串,表示天天看到的字符串。

【样例输入1】:

abc(hello)(world)lcy()x(owq(zrt))

【样例输出1】:

abcollehdlrowlcyxzrtqwo

【样例输入2】:

(y(g(el)da)nis)

【样例输出2】:

singleday

【样例输入3】:

mian()

【样例输出3】:

mian

【时间限制、数据范围及描述】:

时间:1s 空间:256M

对于10% 的数据,保证只出现一对括号,字符串长度小于100,000。

对于另外30% 的数据,保证字符串长度小于100。

对于另外40% 的数据,保证字符串长度小于100,000。

对于剩余的20% 的数据,保证字符串长度小于500,000。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
int a[500610],b[500610],j;
char s[500610];
stack<int> q;
void work(int l,int r,int t){
	if(t%2==0){
		for(int i=l;i<=r;i++){
			if(s[i]!=‘(‘&&s[i]!=‘)‘){
				printf("%c",s[i]);
			}
			else if(s[i]==‘(‘){
				work(i+1,a[i]-1,t+1);
				i=a[i];
			}
		}
		return;
	}
	if(t%2==1){
		for(int i=r;i>=l;i--){
			if(s[i]!=‘(‘&&s[i]!=‘)‘){
				printf("%c",s[i]);
			}
			else if(s[i]==‘)‘){
				work(b[i]+1,i-1,t+1);
				i=b[i];
			}
		}
	}
	return;
}
int main(){
	scanf("%s",s+1);
	int len=strlen(s+1);
	for(int i=1;i<=len;i++){
		if(s[i]==‘(‘){
			q.push(i);
		}
		if(s[i]==‘)‘){
			a[q.top()]=i;
			b[i]=q.top();
			q.pop();
		}
	}
	work(1,len,0);
	return 0;
}

  

原文地址:https://www.cnblogs.com/xiongchongwen/p/11561141.html

时间: 2024-11-02 09:25:11

#587. 天天和不可描述的相关文章

tyvj4868 天天和不可描述

描述 #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define maxn 500010 int len,map[maxn],st[maxn],top,mp[maxn]; char ch[maxn],vis[maxn]; void pr(int l,int r){ if(l<=r){ for(int i=l;i<=r;i++){ if(ch[i]!='(

noip模拟赛 天天和不可描述

分析:直接就这么翻肯定是不行的,换一种想法:有括号就是把括号里的字符串倒着输出,如果在括号里又遇到了括号就继续倒着输出,相当于递归. 我们可以用递归直接做,也可以用一层循环搞定,每次从左括号跳到右括号,再从右括号跳到左括号,之后走一步,就能输出处理后的字符串了,而不会死循环了. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespa

【tyvj P4868】天天和不可描述

http://www.tyvj.cn/p/4868 超级水的题,用递归来模拟,用链表保存这层的内容,每遇到一个左括号就递归一层并合并返回的链表,遇到右括号后返回. 递归进入下一层时传递个参数标记读取新字符是加载链表头还是链表尾就好了. (之前合并两个链表的时候不小心用成insert慢成傻逼,后来才发现insert是拷贝元素,splice才是合并元素) #include <iostream> #include <list> using namespace std; list<c

TI CC2530基础实验(GPIO通用I/O中断操作——一个中断处理程序处理一个端口的多个中断)

有关CC2530的GPIO基本知识.普通GPIO操作有关寄存器的介绍.IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作--点亮led灯) 有关CC2530通用I/O中断操作的基础知识.相关寄存器介绍:TI CC2530基础实验(GPIO通用I/O中断操作--按键控制灯的亮灭) 电路原理图: 程序: /************************************** * 基础实验只需要添加以下这个头文件即可 **********

NOIP模拟赛16

NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2 期望得分:100+100+ =200+ 实际得分:100+40+70=210 T1天天寄快递 直接模拟,代码丢了...... T2天天和不可描述 splay可A 正解dfs+list #include<iostream> #include<list> #include<cstdio> using namespace std; list<char>s; char c; void getstr(boo

TI CC2530基础实验(普通GPIO操作——按一下按键亮一下灯)

有关CC2530的GPIO基本知识.普通GPIO操作有关寄存器的介绍.IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作--点亮led灯) 电路原理图: 分析:需要按一下按键亮一下灯,并且不采用中断方式,即我们需要实时去监测按下是否被按下(P0_4为低电平表示按下,高电平表示松开). 设置: 灯LED1对应的P1_0引脚为普通I/O.方向为输出 按键S1对应的P0_4引脚为普通I/O.方向为输入 程序: /*****************

典型用户及场景描述

典型用户: 姓名:茉莉 性别,年龄:女,20岁 职业:在校大学生 收入:不确定 知识层次和能力:本科生,熟悉各种智能电子设备的操作,熟练各种手游. 生活/工作状况:学习,恋爱,兼职,游玩,天天都有事情做. 动机.目的和困难:动机是找办法打发时间,目的是打发等车的时间,困难是一个人等车无聊没事儿干. 用户偏好:听歌,看书 用户比例:不确定 典型场景:假期回家在火车站候车,没事儿干,太无聊. 典型描述:看着别人都在忙着自己的事情,却找不到一个人聊天.后来通过极速蜗牛打发间. 场景描述: 人物:茉莉

NYOJ 587 blockhouses 【DFS】

blockhouses 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. A blockhouse is a small castle th

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双