(警示后人)《事实证明,瞎写还不如打表》
  • 板块灌水区
  • 楼主creation_hy
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/11/10 12:42
  • 上次更新2023/10/27 03:32:36
查看原帖
(警示后人)《事实证明,瞎写还不如打表》
576378
creation_hy楼主2022/11/10 12:42

CSPJ 350->315……

随便敲了几个,发现1&1&0被卡了

写了两个小时,还没打表分高/kk(打表20pts)

#include <bits/stdc++.h>
using namespace std;
string s;
int c1, c2;
bool calc(string s)
{
    string str;
    for (int i = 0; i < s.size(); i++)
        if (s[i + 2] == '(' && (s[i] == '0' && s[i + 1] == '&' || s[i] == '1' && s[i + 1] == '|'))
        {
            if (s[i] == '0')
                c1++, str += '0';
            else
                c2++, str += '1';
            int cl = 0, cr = 0, p = i + 3;
            while (p < s.size())
            {
                if (s[p] == '(')
                    cl++;
                else if (s[p] == ')')
                    cr++;
                if (cr > cl)
                    break;
                p++;
            }
            i = p;
        }
        else
            str += s[i];
    string ts;
    for (int i = 0; i < str.size(); i++)
        if (str[i] == '(')
        {
            int cl = 0, cr = 0, p = i + 1;
            while (p < str.size())
            {
                if (str[p] == '(')
                    cl++;
                else if (str[p] == ')')
                    cr++;
                if (cr > cl)
                    break;
                p++;
            }
            ts += calc(str.substr(i + 1, p - i - 1)) + '0';
            i = p;
        }
        else
            ts += str[i];
    string b;
    for (int i = 0; i < ts.size(); i++)
        if (ts[i + 1] == '&')
        {
            if (i > 0 && ts[i - 1] == '&')
            {
                if (b.back() == '0')
                    c1++;
                else if (b.back() == '1' && ts[i] == '0')
                {
                    b.pop_back();
                    b += '0';
                }
            }
            else
            {
                if (ts[i] == '0')
                {
                    c1++;
                    b += '0';
                }
                else if (ts[i] == '1' && ts[i + 2] == '1')
                    b += '1';
                else
                    b += '0';
            }
            i++;
        }
        else
            b += ts[i];
    bool ans = b[0] - '0';
    for (int i = 1; i < b.size(); i++)
        if (b[i] == '|')
        {
            if (ans)
                c2++;
            ans |= b[i + 1] - '0';
            i++;
        }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> s;
    cout << calc(s) << '\n';
    cout << c1 << ' ' << c2;
    return 0;
}
2022/11/10 12:42
加载中...