Luogu P1944 最长括号匹配

题面

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;
}
posted @ 2020-09-03 19:52  wwwsfff  阅读(186)  评论(0)    收藏  举报