A. The Monster(贪心或结论)

    技术2022-07-10  127

    Ⅰ . 贪 心 , 神 仙 思 维 \color{Red}Ⅰ.贪心,神仙思维 .,

    设 置 一 个 变 量 k 遇 到 ( 加 一 , 遇 到 右 括 号 减 去 一 设置一个变量k遇到(加一,遇到右括号减去一 k(,

    遇 到 问 号 就 暂 时 把 问 号 当 成 右 括 号 遇到问号就暂时把问号当成右括号

    为 什 么 暂 时 当 成 右 括 号 ? 因 为 当 成 右 括 号 的 话 为什么暂时当成右括号?因为当成右括号的话 ?

    后 续 如 果 想 把 这 个 问 号 换 成 左 括 号 的 话 仍 然 是 合 法 的 后续如果想把这个问号换成左括号的话仍然是合法的

    如 果 暂 时 当 成 左 括 号 , 可 能 后 续 换 成 右 括 号 的 时 候 有 些 问 号 就 不 能 换 如果暂时当成左括号,可能后续换成右括号的时候有些问号就不能换 ,

    #include <bits/stdc++.h> using namespace std; string s; int main() { cin >> s; int len = s.length(),ans=0; for(int i=0;i<len;i++) { int k=0,r=0; for(int j=i;j<len;j++) { if(s[j]=='(') k++; else if(s[j]==')') k--; else k--,r++;//暂时变成右括号 if(!k) ans++; if(k<0) { if(!r) break; else k+=2,r--;//把之前的右括号变成左括号 } } } cout<<ans; }

    Ⅱ . 结 论 法 , 不 会 证 明 \color{Red}Ⅱ.结论法,不会证明 .,

    假 如 没 有 问 号 限 制 , 设 字 符 串 s 长 n , 合 法 的 条 件 是 假如没有问号限制,设字符串s长n,合法的条件是 ,sn,

    对 于 任 意 的 i ∈ [ 1 , n ] 对于任意的i\in[1,n] i[1,n]

    [ 1 , i ] 中 ( 的 数 量 大 于 ) 的 数 量 [1,i]中(的数量大于)的数量 [1,i]()

    [ i , n ] 中 ) 的 数 量 大 于 ( 的 数 量 [i,n]中)的数量大于(的数量 [i,n])(

    s 串 中 ( 和 ) 数 量 相 同 s串中(和)数量相同 s()

    上面的推论显然正确,因为我们已经排除了所以不合法的情况

    现 在 加 入 了 ? , 其 实 换 汤 不 换 药 现在加入了?,其实换汤不换药 ?,

    对 于 任 意 的 i ∈ [ 1 , n ] 对于任意的i\in[1,n] i[1,n]

    [ 1 , i ] 中 ( 的 数 量 + ? 的 数 量 大 于 ) 的 数 量 [1,i]中(的数量+?的数量大于)的数量 [1,i](+?)

    [ i , n ] 中 ) 的 数 量 + ? 的 数 量 大 于 ( 的 数 量 [i,n]中)的数量+?的数量大于(的数量 [i,n])+?(

    #include <bits/stdc++.h> using namespace std; const int maxn=5005; string s; int n,ans,ok[maxn][maxn]; int main() { cin >> s; int n = s.length(); for(int i=0;i<n;i++) { int l = 0,r = 0,q = 0; for(int j=i;j<n;j++) { if(s[j] == '(') l++; else if(s[j] == ')') r++; else q++; if(l+q<r) break;//再往后都不可能了 ok[i][j]=1; } } for(int i=n-1;i>=0;i--) { int l=0,r=0,q=0; for(int j=i;j>=0;j--) { if(s[j] == '(') l++; else if(s[j] == ')') r++; else q++; if(r+q<l) break; if(ok[j][i] && (i-j) % 2 == 1) ans++; } } cout<<ans; }
    Processed: 0.013, SQL: 10