括号匹配的方案数

题面链接

题面

牛牛最近开始学括号匹配拉

给你两个括号序列,不保证合法,求有多少种不同的方法可以将两个括号序列合并成一个合法的括号序列

合并的时候不能改变各自序列原先的顺序

输入描述:

输入两行包含两个字符串s1,s2

1 ≤  |s1|,|s2| ≤ 2500

输出描述:

输出一个整数,魔109+7
示例1

输入

(()  
())

输出

19

输入

()()()()()()()()()()()()()()()()()()()()
()()()()()()()()()()()()()()()()()

输出

487340184
示例3

输入

(((((
)))))

输出

42
示例4

输入

(())())))
(())()

输出

0

备注:

子任务一30分:max(|s1|,|s2|)<=10

子任务二30分:max(|s1|,|s2|)<=100

子任务三40分:max(|s1|,|s2|)<=2500

分析

代码

#include<bits/stdc++.h>
using namespace std;
const int N=200100;
int sum1[N],sum2[N];
int f[4000][4000];
const int mod=1e9+7;
char s1[3000],s2[3000];
int main()
{
    scanf("%s",s1+1);
    scanf("%s",s2+1);
    int len1=strlen(s1+1);
    int len2=strlen(s2+1);
    for(int i=1;i<=len1;i++)
        sum1[i]=sum1[i-1]+(s1[i]=='('?1:-1);
    for(int i=1;i<=len2;i++)
        sum2[i]=sum2[i-1]+(s2[i]=='('?1:-1);
    f[0][0]=1;
    for(int i=0;i<=len1;i++)
        for(int j=0;j<=len2;j++)
        {
            if(sum2[j]+sum1[i]>=0)
            {
				if(i>=1) f[i][j]=(((f[i][j]+f[i-1][j])%mod)+mod)%mod;
            	if(j>=1) f[i][j]=(((f[i][j]+f[i][j-1])%mod)+mod)%mod;
            }
        }
    if(sum1[len1]+sum2[len2]!=0)cout<<0<<endl;
    else cout<<f[len1][len2]<<endl;
}

注意特判:就是当我们将两个字符串全部拼在一起的时候,如果 '('这个字符的个数还是不等于')'这个字符,就说明我们的所有方案都不合

法,直接输出0

本文作者:邦的轩辕

本文链接:https://www.cnblogs.com/bangdexuanyuan/p/13930842.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   邦的轩辕  阅读(311)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.