31 条题解
-
0huyuanming11 LV 10 @ 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致敬
-
02009-07-09 07:04:34@
Orz JackDavid 神牛
-
02009-07-08 23:25:16@
沙茶题留名,Orz JackDavid127神牛!
各位注意,题目没说清,在长度相同的情况下“括号并起来”优先于“括号套起来”……
解题报告+pascal版代码:
http://xujieqi.blog.hexun.com/34758729_d.html -
02009-07-08 18:18:12@
Orz 楼下神牛!
这道题我沙茶了半天…… -
02009-07-08 10:55:44@
zgx你自己config文件弄错了还怪VJ
只有4个测试点却写了10,凹
题意误导群众
输出不能有换行..
WA了3次 -
02009-07-08 09:28:08@
我是神牛我来解释一下!
子串是连续的!!!
-
02009-07-08 09:23:07@
看不懂样例……
-
02009-07-08 08:48:20@
..........
-
-12015-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;
} -
-12009-07-23 08:51:31@
想复杂了……