题目链接
题目大意
就是执行这个伪代码
res = 0
for init = 0 to inf
cur = init
ok = true
for i = 1 to |s|
res = res + 1
if s[i] == '+'
cur = cur + 1
else
cur = cur - 1
if cur < 0
ok = false
break
if ok
break
Ⅰ.当cur小于0时会终止当前for循环,然后cur初始值加一,重新开始一遍
Ⅱ.当cur始终大于0时会跑满for循环,然后直接退出程序Ⅱ.当cur始终大于0时会跑满for循环,然后直接退出程序Ⅱ.当cur始终大于0时会跑满for循环,然后直接退出程序
题目思路
主要是要发现每次break的位置符合递增。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const int mod=1e9+7;
int t,a,b,c;
char s[maxn];
int main(){
scanf("%d",&t);
while(t--){
scanf("%s",s+1);
int d=strlen(s+1),pre=0,mi=0;
ll ans=0;
for(int i=1;i<=d;i++){
if(s[i]=='+'){
pre++;
}else{
pre--;
}
if(pre<mi){
mi=pre;
ans+=i;
}
}
ans+=d;//序列全部执行
printf("%lld\n",ans);
}
return 0;
}