• 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了呢!






  • 相关阅读:
    用于.NET环境的时间测试(转)
    HTML->CSS->JS->PHP的顺序及相关网址(转)
    经典的CSS代码(转)
    初阶html学习总结(一)(转)
    如何学习javascript?(转)
    如何给网页标题栏上添加图标(favicon.ico)(转)
    网页颜色代码对照(转)
    前端开发代码命名的整理(转)
    前端代码规范总结(转)
    基于重心偏移的视差计算
  • 原文地址:https://www.cnblogs.com/lzhAFO/p/8128130.html
Copyright © 2020-2023  润新知