zoukankan      html  css  js  c++  java
  • hihocoder 1671 反转子串

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    给定一个只包含括号和小写字母的字符串S,例如S="a(bc(de)fg)hijk"。  

    其中括号表示将里面的字符串翻转。(注意括号可能嵌套)

    请你输出翻转之后的字符串。

    输入

    字符串S。

    对于50%的数据,|S| ≤ 1000  

    对于100%的数据, |S| ≤ 5000000

    输出

    输出反转后的字符串(不带括号)。

    样例输入
    a(bc(de)fg)hijk
    样例输出
       agfdecbhijk

    大意:给出一个字符串,里面有合法的小括号,小括号内的字符串反转,输出最后的序列(去掉括号)




    解析:正如我们看到括号配对的联想,这题就是一个栈或者说递归,考场上不知道为何50分暴力也写错了~~~



    正解:首先将括号配对(用两个数组分别记录左括号对应右括号的的位置 和 右括号对应左括号的位置)
    然后就开始正序遍历,遇到普通非括号字符直接输出,遇到左括号,假装反转括号内的字符(添加rev标记并进入下次递归)
    如果有rev标记,逆序遍历,
    遇到普通非括号字符直接输出,遇到右括号,假装反转括号内的字符(去除rev标记并进入下次递归)
    就这么愉快的结束了,不过评测姬如果是windows的话怕是会爆栈,可以考虑加个手工栈。
     1 /*
     2 Welcome Hacking
     3 Wish You High Rating
     4 */
     5 #include<iostream>
     6 #include<cstdio>
     7 #include<cstring>
     8 #include<ctime>
     9 #include<cstdlib>
    10 #include<algorithm>
    11 #include<cmath>
    12 #include<string>
    13 using namespace std;
    14 int read(){
    15     int xx=0,ff=1;char ch=getchar();
    16     while(ch>'9'||ch<'0'){if(ch=='-')ff=-1;ch=getchar();}
    17     while(ch>='0'&&ch<='9'){xx=(xx<<3)+(xx<<1)+ch-'0';ch=getchar();}
    18     return xx*ff;
    19 }
    20 const int maxn=5000010;
    21 int N,stack[maxn],tp,Prev[maxn],Next[maxn];
    22 char s[maxn];
    23 void dfs(int st,int en,bool rev){
    24     if(!rev){
    25         for(int i=st;i<=en;i++){
    26             if(s[i]!='(')
    27                 printf("%c",s[i]);
    28             else{
    29                 dfs(i+1,Next[i]-1,1);
    30                 i=Next[i];
    31             }
    32         }
    33     }
    34     else{
    35         for(int i=en;i>=st;i--){
    36             if(s[i]!=')')
    37                 printf("%c",s[i]);
    38             else{
    39                 dfs(Prev[i]+1,i-1,0);
    40                 i=Prev[i];
    41             }
    42         }
    43     }
    44 }
    45 int main(){
    46     //freopen("in","r",stdin);
    47     //freopen("out","w",stdout);
    48     gets(s);
    49     N=strlen(s);
    50     for(int i=0;i<N;i++){
    51         if(s[i]=='(')
    52             stack[++tp]=i;
    53         else if(s[i]==')'){
    54             Next[stack[tp]]=i;
    55             Prev[i]=stack[tp];
    56             tp--;
    57         }
    58     }
    59     dfs(0,N-1,0);
    60     return 0;
    61 }
    View Code
    
    

    仍然是高仿某位大神的代码,超好背的呢!看了一遍,就默写出来AC了呢!






  • 相关阅读:
    MKMapVIew学习系列2 在地图上绘制出你运行的轨迹
    WPF SDK研究 Intro(6) WordGame1
    WPF SDK研究 Intro(3) QuickStart3
    WPF SDK研究 Layout(1) Grid
    WPF SDK研究 目录 前言
    WPF SDK研究 Intro(7) WordGame2
    WPF SDK研究 Layout(2) GridComplex
    对vs2005创建的WPF模板分析
    WPF SDK研究 Intro(4) QuickStart4
    《Programming WPF》翻译 第6章 资源
  • 原文地址:https://www.cnblogs.com/lzhAFO/p/8128130.html
Copyright © 2011-2022 走看看