1 条题解

  • 0
    @ 2026-4-1 14:05:38

    哎细节太多了 我简单小总结一下 1只要用到 top 必须满足1判空 或者2前一刻已经push 2对于栈内PII 元素只能取出来一个一个比 3对于本题仅(/)对象简单但数量严格要求不妨利用PII存个数量减缓存储操作

    思路 输入长度n的括号串--输出消去 k括号的最终结果 本题对象无非就是 ( / ) 先把结果放栈里 该消去的消去 对象分析: 1(:若是第一个 就加入标记1 若不是 就在前置基础++ 2):若是第一个 加入标记1 若不是就++-------如果加到k 直接先消去 再看下面是不是有(k 如果有一并消去 否则再次加入

    #include<bits/stdc++.h> using namespace std; #define int long long /* 括号匹配:给n k k括号--即k=2 (()) k=3 ((())) */ #define PII pair<char,int> int n,k; string s; stack stk; signed main() { std::ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n>>k; cin>>s; for(int i=0;i<n;i++) { if(s[i]'(')//左括号 { if(!stk.empty()&&stk.top().first'(') stk.top().second++; else stk.push({'(',1}); } else//右括号 { if(!stk.empty()&&stk.top().first==')') stk.top().second++; else stk.push({')',1}); //放进去后进行判断 if(stk.top().secondk) { auto w=stk.top();//存当前右括号 stk.pop(); bool flag=0; char ch;//就是( int t;//左 存数 //判断谈完后是不是空 if(!stk.empty()) { ch=stk.top().first; t=stk.top().second; } else //如果谈完后是空的 { stk.push(w);continue; } //如果(可以消除 分类) if(!stk.empty()&&ch'('&&t>k) { stk.pop(); flag=1; stk.push({'(',t-k}); } if(!stk.empty()&&ch=='('&&t==k) { stk.pop(); flag=1; } if(!flag) stk.push(w) ;//还原 } } } //最终栈内就是倒叙ans 注意取出 string ans; while(!stk.empty()) { //1取出 auto x=stk.top(); stk.pop(); for(int i=1;i<=x.second;i++) ans=x.first+ans;//不断向前加 } cout<<ans<<"\n"; return 0; }

    • 1

    信息

    ID
    747
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    144
    已通过
    32
    上传者