Beautiful Quadruples

https://www.hackerrank.com/challenges/xor-quadruples/problem

https://www.hackerrank.com/challenges/xor-quadruples/editorial

关键点:

1. 把4个数拆成2组,预先计算,而且预先计算是小于x的区间范围(遍历后面那组的时候就会发现要这样才能做到O(NN))

2. 异或有范围,最大4096

3. 先排序,不懂为什么,有人说:order doesn't matter. If you sort a,b,c,d then you can eliminate the need to check for permutations

def beautifulQuadruples(a, b, c, d):
    res=0
    
    total_=[0]*(1+b)
    for i in range(1,b+1): total_[i]=min(i,a)
    total=[0]*(1+b)
    for i in range(1,b+1): total[i]=total[i-1]+total_[i]
    for i in range(1,c+1): res+=total[min(i,b)]*max(0,d-i+1)
#    print(res)
    
    cnt_=[[0 for _ in range(4097)] for _ in range(1+b)]
    for i in range(1,a+1):
        for j in range(i,b+1):
            cnt_[j][i^j]+=1
    cnt=[[0 for _ in range(4097)] for _ in range(1+b)]
    for j in range(4097):
        for i in range(1,1+b):
            cnt[i][j]=cnt[i-1][j]+cnt_[i][j]
    
    for i in range(1,c+1):
        for j in range(i,d+1):
            res-=cnt[min(i,b)][i^j]
    return res

if __name__ == '__main__':
    abcd = list(map(int,input().strip().split(' ')))
    abcd.sort()
    a = int(abcd[0])
    b = int(abcd[1])
    c = int(abcd[2])
    d = int(abcd[3])
    result = beautifulQuadruples(a, b, c, d)
    print(result)

 

// 将中缀表达式转换为后缀表达式 vector<string> HouZhui(const vector<pair<string, string>>& infixTokens) { vector<string> postfix; stack<string> operatorStack; for (auto token : infixTokens) { if (isOperator(token.second[0])) { while (!operatorStack.empty() && isOperator(operatorStack.top()[0]) && precedence[token.second[0]] <= precedence[operatorStack.top()[0]]) { postfix.push_back(operatorStack.top()); operatorStack.pop(); } operatorStack.push(token.second); } else if (token.second == "(") { operatorStack.push(token.second); } else if (token.second == ")") { while (!operatorStack.empty() && operatorStack.top() != "(") { postfix.push_back(operatorStack.top()); operatorStack.pop(); } operatorStack.pop(); // 弹出"(" } else { postfix.push_back(token.second); } } while (!operatorStack.empty()) { postfix.push_back(operatorStack.top()); operatorStack.pop(); } return postfix; } // 输出状态栈分析过程 void ZtStack(const vector<string>& postfixTokens) { cout << "状态栈分析过程:" << endl; stack<string> analysisStack; for (auto token : postfixTokens) { if (isOperator(token[0])) { string operand2 = analysisStack.top(); analysisStack.pop(); string operand1 = analysisStack.top(); analysisStack.pop(); string temp = "t" + to_string(analysisStack.size() + 1); analysisStack.push(temp); cout << operand1 << " " << token << " " << operand2 << " " << temp << endl; } else { analysisStack.push(token); } } cout << endl; } // 打印四元式表 void SiYuan(const vector<string>& postfixTokens) { cout << "四元式表:" << endl; vector<vector<string>> quadruples; stack<string> operandStack; int tempCount = 0; for (auto token : postfixTokens) { if (isOperator(token[0])) { string operand2 = operandStack.top(); operandStack.pop(); string operand1 = operandStack.top(); operandStack.pop(); string result = "t" + to_string(tempCount); tempCount++; quadruples.push_back({operand1, operand2, token, result}); operandStack.push(result); } else { operandStack.push(token); } } for (auto quadruple : quadruples) { cout << quadruple[2] << " " << quadruple[0] << " " << quadruple[1] << " " << quadruple[3] << endl; } cout << endl; }帮我详细分析一下这段代码
06-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值