牛客小白月赛45 D

括号问题:

题意:给你一个字符串,你可以在任意位置切一刀,形成多个串,要保证切之后的串也是可以括号匹配的才是合法的切答案的方法,如果无论如何且 总有不合法的括号匹配存在的话我们就输出一个 -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

思维还是,多看看这种题目挺好的

你可能感兴趣的:(DP,思维,算法,动态规划)