给定一个括号序列,你需要对求出:这个括号序列的所有不同的子串中,有多少个是标准的括号序列?
一个括号序列的子串指的是这个序列从某个位置起始、到某个位置截止的子字符串。如果两个子串拥有不同的起始位置或截止位置,那么它们就被认为是括号序列的不同的子串。
标签:div false main else 不同的 syn amp nbsp 整数
()(())
4
设输入字符串的长度为n。
对于30%的数据,满足n≤200。
对于60%的数据,满足n≤5000。
对于100%的数据,满足1≤n≤10^6。
题解:题目要求必须是子串,也就是要连续的,因此当前面有一个合法的话,如果紧接着又出现了一个合法的,那么方法数就是(1+1)种,如果前面有n种连续的合法的括号的话,紧接着又出现一个合法的,那么方法数就是(1+n),所以每当遇到一个合法的括号对的时候,看他前面是否有连续的括号对,用stack记录,用stack.pre来记录当以这个括号作为两个连续合法序列的分隔时,这个括号后面有多少个合法的序列。
#include <bits/stdc++.h>
#define ll long long
#define met(a,x) memset(a,x,sizeof(a))
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
char a[N];
struct node
{
int x,pre;
} b;
stack<node> s;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>a+1;
int len=strlen(a+1);
ll ans=0;
ll sum=0;
for(int i=1; i<=len; i++)
{
if(a[i]==‘(‘)
b.x=1;
else
b.x=2;
if(!s.empty())
{
if(s.top().x==1&&b.x==2)
{
s.pop();
if(s.empty())
{
ans+=(sum+1);
sum++;
}
else
{
ans+=(s.top().pre+1);
s.top().pre++;
}
}
else
s.push(b);
}
else
s.push(b);
}
cout<<ans<<endl;
return 0;
}
标签:div false main else 不同的 syn amp nbsp 整数
原文地址:https://www.cnblogs.com/nublity/p/10278933.html