题目:2003. 找到牛!
题解:我们将每一个连续两个‘(’的位置标记为1(我选的是右边的’(‘的下标a[i])。然后再将每一个连续两个‘)’的位置标记为1(我选的是右边的’)'的下标b[i]),接着对b数组求前缀和。最后遍历每个位置,sum+=a[i]*(b[len]-b[i]).
说白了就是看’((‘的右边有多少个’))’
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int ,int > PII;
typedef long long LL;
const int N=5e4+10;
const int mod=1e9;
int a[N],b[N];
int main(){
char s[N];
cin>>s+1;
int len=strlen(s+1);
for(int i=1;i<=len;i++){
if(s[i-1]=='('&&s[i]=='('){
a[i]=1;
}
}
for(int i=1;i<=len;i++){
if(s[i-1]==')'&&s[i]==')'){
b[i]+=1;
}
b[i]+=b[i-1];
}
LL sum=0;
for(int i=1;i<=len;i++){
sum+=a[i]*(b[len]-b[i]);
}
cout<<sum;
return 0;
}