题目链接
题目大意
就是执行这个伪代码
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;
}