當然像蒟蒻的我會在這個題上模擬一邊僞代碼,如果程序沒有跳出的話,說明當前 cur 沒有跑遍 s 數組就已經變成了負數,所以在下一次循環中 ,也就是 cur+1 的值仍能跑到當時 cur 跑到的地方,我們記下 cur 跑到的位置,以及在 cur 遍歷數組過程中 res 增長的值 即可,思想類似於剪枝
const int N=1e6+5;
int n,m,t;
int i,j,k;
char s[N];
int main()
{
IOS;
rush(){
cin>>s+1;
int len = strlen(s+1);
ll res = 0; //保存答案,注意數據類型
int pos = 1; //上一次的位置
int val = 0; //記錄上一次 cur 跳出時的值,應該是 -1
int tmp = 0; //記錄 cur 遍歷過程中,res 的增長值
for(int init=0;init<=inf;init++)
{
int cur = val;
bool ok = true;
//debug(tmp);
res += tmp;
//tmp=0;
for (int i=pos;i<=(len);i++){
tmp = tmp + 1;
if (s[i] == '+')
cur = cur + 1;
else
cur = cur - 1;
//debug(cur);
if (cur < 0){
pos = i+1; //直接從下一個位置開始遍歷
val = cur+1;
//cout<<-1<<endl;
//debug(pos);debug(val);
ok = false;
break;
}
}
if (ok) break;
}
cout<<res+tmp<<endl; //最後遍歷完成 tmp==len
}
//PAUSE;
return 0;
}
更簡潔的 AC 代碼:
const int N=1e6+5;
int n,m,t;
int i,j,k;
char s[N];
int main()
{
//IOS;
rush(){
cin>>s+1;
int len=strlen(s+1);
ll res=0,cur=0;
for(i=1;i<=len;i++){
if(s[i]=='+') cur++;
else cur--;
if(cur<0) res+=i,cur=0;
}
cout<<res+len<<endl;
}
//PAUSE;
return 0;
}