51nod 1791 合法括号子段
因为在括号串固定的情况下,括号的匹配是固定不变的。所以对左括号进行匹配,p[i]表示与i这个括号相匹配的括号的位置,易得到dp方程 ans[i]=ans[p[i]+1]+1,然后再从后先前一遍求和即可。
#include<bits/stdc++.h> using namespace std; #define ll long long const int N=1100005; char c[N]; ll ans[N]; int p[N]; int s[N]; int top; int t; int main() { ios::sync_with_stdio(false); cin>>t; while(t--){ cin>>(c+1); int n=strlen(c+1),top=0; for(int i=1;i<=n;i++){ p[i]=-1; } for(int i=1;i<=n;i++){ if(c[i]=='('){ s[++top]=i; } else if(top){ p[s[top--]]=i; } } ll sum=0; for(int i=n;i>=1;i--){ if(p[i]==-1){ ans[i]=0; } else{ ans[i]=ans[p[i]+1]+1; } sum+=ans[i]; } cout<<sum<<"\n"; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」