题解

31 条题解

  • 0
    @ 2009-07-09 11:28:10

    Orz神牛

    终于过了

    交了2次都超时

    后来发现输入写错了

    scanf("%c", &ch);

    while ((ch == '(') || (ch == ')') ||

    (ch == '[') || (ch == ']') ||

    (ch == '{') || (ch == '}')) {

    str[++len] = ch;

    scanf("%c", &ch);

    }

    这样会超时....囧

    本来以为cin才会超......

    后来改成

    gets((str + 1));

    len = strlen((str + 1));

    终于过了.........

    感觉有点像极大化思想

    向Jack致敬

  • 0
    @ 2009-07-09 07:04:34

    Orz JackDavid 神牛

  • 0
    @ 2009-07-08 23:25:16

    沙茶题留名,Orz JackDavid127神牛!

    各位注意,题目没说清,在长度相同的情况下“括号并起来”优先于“括号套起来”……

    解题报告+pascal版代码:

    http://xujieqi.blog.hexun.com/34758729_d.html

  • 0
    @ 2009-07-08 18:18:12

    Orz 楼下神牛!

    这道题我沙茶了半天……

    • @ 2014-03-15 21:47:05

      艹,这题不就是JZP你出的?

  • 0
    @ 2009-07-08 14:00:16

    稀里糊涂地过了……第一个秒杀……

    其实这一题可以这么做:

    先找出所有形如{}的和谐子串,保存每个子串的起止下标,再进行扩展:

    1、外层括号扩展

    2、两子串合并扩展

    直到无法扩展为止,求出最大子串。

    点击这里看详细解题报告

  • 0
    @ 2009-07-08 10:55:44

    zgx你自己config文件弄错了还怪VJ

    只有4个测试点却写了10,凹

    题意误导群众

    输出不能有换行..

    WA了3次

  • 0
    @ 2009-07-08 09:28:08

    我是神牛我来解释一下!

    子串是连续的!!!

  • 0
    @ 2009-07-08 09:23:07

    看不懂样例……

  • 0
    @ 2009-07-08 08:48:20

    ..........

  • -1
    @ 2015-10-04 19:35:48

    详细题解比较少,口胡几句。。

    直接模拟栈操作就可以了

    一开始读入所有字符存放入字符数组s

    使用2个栈,一个是控制符栈,存放没有配对好的括号。另一个是存放和谐串的栈,这个栈的每个元素记录2个信息,分别是该和谐串的长度,以及该和谐串的末尾在字符数组位置。

    从前往后依次扫描s[i]
    如果遇到了左括号,将这个括号压入控制符栈,同时在和谐串栈中插入一个长度为0,末尾为i的记录信息。
    如果遇到了右括号,检查是否与控制符栈顶的配对。如果不配对,依然在和谐串中插入一个长度为0,末尾为i的记录信息。
    显然每一个控制符栈中的元素都对应于1个长度为0的和谐串的记录信息。
    那么如果配对,就将和谐串栈中的元素不断弹出,直到弹出一个长度为0的和谐串(这个信息对应于控制符栈顶的括号),我们再将弹出的字符串的总长度+2重新压入和谐串栈。同时我们将控制符栈顶元素弹出。

    最后我们再扫描一遍和谐串栈,这个栈此时一定被许多个"0"分成许多段,这里的每一段都可以合并为一个长的和谐子串。我们找到的最长的一段的长度,其所对应的和谐子串就是本题的答案

    附代码
    #include<cstdio>
    struct ele{
    int l,x;
    };
    const int maxs=5000000;
    int n,et,at,sum,i,max,ans;
    char c,s[maxs+10],a[maxs+10];
    ele e[maxs+10];
    int main(){
    while ((c=getchar())>33)
    s[++n]=c;
    for (i=1;i<=n;i++){
    if ((s[i]==')')||(s[i]==']')||(s[i]=='}')){
    if (((s[i]==')')&&(a[at]=='('))||((s[i]==']')&&(a[at]=='['))||((s[i]=='}')&&(a[at]=='{'))){
    --at;
    sum=2;
    while (e[et].l!=0)
    sum+=e[et--].l;
    e[et].l=sum;
    e[et].x=i;
    }
    else {
    a[++at]=s[i];
    e[++et].x=i;
    e[et].l=0;
    }
    }
    else {
    a[++at]=s[i];
    e[++et].x=i;
    e[et].l=0;
    }
    }
    sum=0;
    e[et+1].l=0;
    for (int i=1;i<=et+1;i++)
    if (e[i].l==0){
    if (sum>max){
    max=sum;
    ans=e[i-1].x;
    }
    sum=0;
    }
    else
    sum+=e[i].l;
    for (int i=ans-max+1;i<=ans;i++)
    putchar(s[i]);
    putchar('\n');
    return 0;
    }

  • -1
    @ 2009-07-23 08:51:31

    想复杂了……

信息

ID
1572
难度
7
分类
数据结构 | 点击显示
标签
(无)
递交数
1139
已通过
198
通过率
17%
被复制
4
上传者