括号问题:
题意:给你一个字符串,你可以在任意位置切一刀,形成多个串,要保证切之后的串也是可以括号匹配的才是合法的切答案的方法,如果无论如何且 总有不合法的括号匹配存在的话我们就输出一个 -1,只要有一个不同的下位置我们都认为是一种不同的切割方法。
分析:
首先得知道括号问题这个基础模型,我们如何判断一个序列是合法的配对序列呢?可以记录一个量lb,从前往后扫描整个串,如果我们需要一个左括号的话就lb++,遇到右括号的话且lb大于0的时候我们才lb--(即现在有可以等待匹配的),最后如果我们的lb不是0的话就是非法的序列,反之是合法的序列。
然后我们如何确定我们的切点在哪?
这里容易发现,如果我们维护一个前缀和的话,只有从前往后(在已经是合法串的情况下)
只要当前位置的前缀和是0的话我们就可以知道当前位置就是一个合法的切割位置,总数记作
ans的话,那么我们的答案就是pow(2,ans)%p 这里用不用快速幂都可以
#include
using namespace std;
const int N=1e6+10,p=1e9+7;
typedef long long ll;
string str;
ll w[N];
ll ans;
ll qmi(ll a,ll b){
ll res=1;
while(b){
if(b&1)res=res*a%p;
b>>=1;
a=ll(a*a)%p;
}
return res;
}
int main(){
cin>>str;
int len=str.size();
int lb=0;
for(int i=0;i
思维还是,多看看这种题目挺好的