Codeforces Round #504 ---- C. Bracket Subsequence(栈)

版权声明:本文为博主原创文章,转载请预先通知博主(〃'▽'〃)。 https://blog.csdn.net/m0_37624640/article/details/81806354

题目链接

没想到这道题竟然是我感觉到最简单的……

做法:利用栈,栈存储的是字符串的下标

是"("时,对应的下标入栈。

是")"时,判断栈顶元素是否匹配,是的话,把他俩的下标,直接用数组哈希存储一下,即 pos[i] = i,然后把"("的下标弹出去

最后遍历哈希数组输出k个字符即可

AC代码:

#include<bits/stdc++.h>
#define rep(i,s,t) for(int i = (int)(s); i <= (int)(t); i++)
#define rev(i,t,s) for(int i = (int)(t); i >= (int)(s); i--)
#define pb(x) push_back(x)
#define all(x) x.begin(),x.end()
#define sz(x) (int)(x).size()
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxn = 2e5+5;
const int INF = 0x3f3f3f3f;
bool pos[maxn];
stack<int> sc;
int main()
{
    #ifdef LOCAL_FILE
    freopen("in.txt","r",stdin);
    #endif // LOCAL_FILE
    ios_base::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int n,k;
    cin>>n>>k;
    string s;
    cin>>s;
    int p = 0;
    for(int i=0;i<(int)s.length();i++)
    {
        if(s[i] == '(')
        {
            p = i;
            break;
        }
    }
    sc.push(p);
    int cnt = 0;
    for(int i=p+1;i<(int)s.length();i++)
    {
        if(!sc.empty()&&s[sc.top()] == '(' && s[i] == ')')
        {
            pos[sc.top()] = 1;
            pos[i] = 1;
            cnt+=2;
            if(cnt == k)
                break;
            sc.pop();
            //cout<<1<<endl;
        }
        else if(s[i] == '(')
        {
            //cout<<1<<endl;
            sc.push(i);
        }
//        cout<<i<<endl;
    }
    int c = 0;
    for(int i=0;i<maxn;i++)
    {
        if(pos[i])
        {
            cout<<s[i];
            c++;
            if(c == k)
                break;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37624640/article/details/81806354