SDUT 1451 括号东东
括号东东
Time Limit: 1000MS Memory limit: 65536K
题目描述
已知给出若干个只包含 “(” 或者 “)”字符串str!字符串的长度小于等于100W!求最长合法子串以及合法子串的个数!!
合法字串的格式要求如下:
1. “()”
2. “(())()”
3. “(()(()))”
不合法的情况如:
1. “)(”
2. “(()”
3. “(()))(”
4.......
输入
输入包含若干组测试数据,每组为一行字符串。
输出
对于每组测试数据,输出最长合法子串以及合法子串的个数(如果最长合法子串为0,那么输出 0 1)!
示例输入
))()((())))(()())
示例输出
0 16 2
提示
来源
Azheng@SDJZU
示例程序
这是我们周赛的一道题目,现在看来几乎是最简单的了,这道题目题意表述不清,尤其输出最后让求合法字串的个数的时候,这是这个题目的错误所在,其实这题目让求的是最长合法字串的个数,我一开始就按照求合法字串的个数来做的,可是却是一次又一次的WA,哎,最后问了别人,才知道这题目最后求的是最长合法字串的个数。
其实这道题目求所有合法字串的个数也是一个很不错的题目,求最长合法合法字串的个数,就把这个题目弄的有些简单了。
[cpp]
#include <stdio.h>
#include <string.h>
#include <math.h>
char s1[1000000];
char statck[1000000];
struct num
{
int pos;
char c;
}b[1000000];
int main()
{
int i,j,n,m,s,t,l,top,k,res,max;
while(scanf("%s",s1)!=EOF)
{
l=strlen(s1);
top=0;
for(i=0;i<=l-1;i++)
{
if(s1[i]=='(')
{
b[top].pos=i;
b[top++].c='(';
}else if(s1[i]==')')
{
if(top>0&&b[top-1].c=='(')
{
top-=1;
}else
{
top=0;
}
}
}
for(i=top-1;i>=0;i--)
{
s1[b[i].pos]=')';
}
top=0; max=0; res=0; k=0;
for(i=0,s=0;i<=l-1;i++)
{
if(s1[i]=='(')
{
statck[top++]='(';
}else if(s1[i]==')')
{
if(top>0&&statck[top-1]=='(')
{
s+=2;
top-=1;
k=1;
}else
{
if(max<s&&k==1)
{
max=s;
s=0;
res=1;
}else if(max==s&&k==1)
{
res++;
s=0;
}
s=0;
top=0;
k=0;
}
}
}
if(k==1)
{
if(max<s)
{
max=s;
res=1;
}else if(max==s)
{
res++;
}
}
if(max!=0)
{ www.zzzyk.com
printf("%d %d\n",max,res);
}else
{
printf("0 1\n");
}
}
return 0;
}
补充:软件开发 , C++ ,