我太菜了
赛时用\(O(n^2)\)的方法做,真的想不到什么线性的方法,比完才知道原来这么******简单
如何得到思路
我们肯定要尽可能地得到一串数字使其和为零
假设\(B\)为最长的一串数字和为零的序列,那么可能存在其子序列的和也为零,而我们把这个子序列从\(B\)中分开来对最后的结果是没有影响的,因为0-0=0
而最短的子序列和为零的是恰好相邻的异号,所以我们可以用栈,只要放进去的时候遇到异号就消除,最后栈的大小就是答案。
然后我们发现只要异号相邻就消除,所以最后栈内的元素肯定同号,我们可以直接统计加号和减号个数,然后减一减就得到答案了
\(Code\)
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
int n,ans=0;
cin>>n;
string s;
cin>>s;
for(int i=0;s[i];i++)
if(s[i]=='+') ans++;
else ans--;
cout<<abs(ans)<<endl;
}
return 0;
}
标签:int,cin,Plus,Split,ans,序列,tie,Minus
From: https://www.cnblogs.com/pure4knowledge/p/17991624