rexp
Description
给出一个由(,),|,a组成的序列,求化简后有多少个a。
化简规则:
1、形如aa...a|aa...a|aa...a的,化简结果为“|”两边a的个数最多的一项,例如a|aa|aaa=aaa
2、先算带括号的序列,例如(a|a)|aaa=aaa
Input
一行一个序列
Output
化简后a的个数
思路1:我的思路是计算有多少括号,在原来括号的位置放相应数量的a,其他全变成A,然后扫一遍,不知道哪里错了,AOJ有一个数据一直T,先记下来,说不定以后发现问题了。
代码1:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char a[100010]={'\0'};
gets(a);
int l,r,tag=0,max=0,num=0,s=0;
for(int i=0;a[i]!='\0';i++) //tag记录括号数量
if(a[i]=='(')
tag++;
while(tag--){ //计算括号内a
for(int i=0;a[i]!='\0';i++)
{
if(a[i]=='(')
l=i;
if(a[i]==')')
{
r=i;
break;
}
}
num=0;
s=0;
max=0;
for(int i=l;i<=r;i++)
{
if(a[i]=='a')
num++;
if(a[i+1]=='|'||a[i+1]==')')
{
max=max<num?num:max;
num=0;
}
a[i]='A';
}
for(int i=l;i<l+max;i++)
a[i]='a';
}
for(int i=0;a[i]!='\0';i++)
{
if(a[i]=='a')
num++;
if(a[i+1]=='|'||a[i+1]=='\0')
{
max=max<num?num:max;
num=0;
}
}
cout>>max;
return 0;
}
思路2:
递归,遇见‘(’加上括号里的;遇见‘ | ’判断大小;遇见‘)’结束相加。
代码2(转载):
#include<bits/stdc++.h>;
using namespace std;
char ch;
int query()
{
int ans=0,num=0;
while(true)
{
ch=getchar();
if(ch=='a') ++num;
else
if(ch=='(') num+=query();
else
if(ch==')') return ans=max(ans,num);
else
if(ch=='|') ans=max(ans,num),num=0;
else
if(ch==EOF) return ans=max(ans,num);
}
}
int main()
{
return printf("%d\n",query())*0;
}