栈 Codeforces612C Replace To Make Regular Bracket Sequence

来源:互联网 发布:安卓手机数据恢复大师 编辑:程序博客网 时间:2024/06/03 17:18

传送门:点击打开链接

题意:有4种括号配对,现在能把一种括号改变成另一种括号,但是不允许改变括号的开口方向。问最少的操作次数能把括号全部配对

思路:运用栈去操作,如果是左括号,则压入栈,如果是右括号,看是否和栈顶配对,如果不配对就ans++,无论是否配对成功都弹出栈顶。

如果途中栈空了也取栈顶,或者最后栈不为空,这些都是非法的,特判一下

#include<map>#include<set>#include<cmath>#include<ctime>#include<stack>#include<queue>#include<cstdio>#include<cctype>#include<string>#include<vector>#include<cstring>#include<iostream>#include<algorithm>#include<functional>#define fuck(x) cout<<"["<<x<<"]"#define FIN freopen("input.txt","r",stdin)#define FOUT freopen("output.txt","w+",stdout)using namespace std;typedef long long LL;const int MX = 1e6 + 5;int A[MX], rear;char s[MX];char f(char x) {    if(x == '<') return '>';    if(x == '{') return '}';    if(x == '[') return ']';    if(x == '(') return ')';    return 0;}void solve() {    int n = strlen(s), ans = 0; rear = 0;    for(int i = 0; i < n; i++) {        int t = f(s[i]);        if(t) A[++rear] = s[i];        else {            if(!rear) {                printf("Impossible\n");                return;            }            if(f(A[rear--]) != s[i]) ans++;        }    }    if(!rear) printf("%d\n", ans);    else printf("Impossible\n");}int main() {    //FIN;    while(~scanf("%s", s)) {        solve();    }    return 0;}


0 0
原创粉丝点击