Luogu P1944 最長括號匹配
阿新 • • 發佈:2020-09-03
Dp很好想,下面普及一種不用DP的方法
每次,將可以配對的標記成1,最後求最長的連續1片段
坑:字串取strlen每次呼叫O(n),所以不要作為終止條件,會不知不覺變成O(N^2)
#include<bits/stdc++.h> using namespace std; const int N=1e6+5; bool vis[N]; int top,st[N]; char s[N]; int main() { scanf("%s",s); int n=strlen(s); for(int i=0;i<n;i++) { if(s[i]==']'||s[i]==')') { if(top) { if(s[st[top]]=='['&&s[i]==']'||s[st[top]]=='('&&s[i]==')') { vis[st[top]]=1,top--; vis[i]=1; } else top=0; } } else st[++top]=i; } int l=1,r=0,now=0; for(int i=0;i<n;i++) { if(vis[i]) now++; else { if(r-l+1<now) { r=i-1,l=i-now; } now=0; } } for(int i=l;i<=r;i++) { putchar(s[i]); } return 0; }