xay loves or(2021牛客多校第七场I)

题目描述

xay loves or. He gives you x and s, you need to calculate how many positive integer y satisfy x or y = s .

输入描述

The first line contains two positive integers x and s .

It’s guaranteed that 1 ≤ x , s < 2 ^ 31 .

输出描述

Print the number of y satisfy x or y = s .

输入样例

2 5

输出样例

0

题目大意:给定 x 和 s,求有多少个正整数 y 满足 x or y = s;

快乐签到题,唯一的坑点是 y 是正整数,因此只需要在 x = s 时将 y 的数量 -1 即可。

其中, x 和 s 每一位的出现共有四种情况:

① x = 1,s = 0,此时 y 无解,直接输出 0 即可;
② x = 1,s = 1,此时 y 可为 0 或 1 ,即 y * = 2;
③ x = 0,s = 0,此时 y 只能为 0;
④ x = 0,s = 1,此时 y 只能为 1;

因此本题仅需特判 x 和 s 对应的每一位是否满足条件 ① ② 中的一组并进行处理即可。

参考代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int ax[40],as[40];
ll lb(ll a){
    return a&(-a);
}

int main(){
    ll x,s,b,c,y=1,cnt;
    cin>>x>>s;
    ll xx=x,ss=s;
    while(x){
        b=lb(x);
        x-=b;
        cnt=0;
        while(b){
            b/=2;
            cnt++;
        }
        ax[cnt]=1;
    }
    
    while(s){
        c=lb(s);
        s-=c;
        cnt=0;
        while(c){
            c/=2;
            cnt++;
        }
        as[cnt]=1;
    }

    for(int i=32;i>=1;i--){
        if(ax[i]==1&&as[i]==0){
            cout<<'0'<<endl;
            return 0;
        }
        if(ax[i]==1&&as[i]==1)
            y=y*2;
    }
    
    if(xx==ss)
        y--;
    cout<<y<<endl;
    
    return 0;
}
好的,我来为您分析这个文法和输入串。 首先,让我们来看一下这个文法的产生式: S → xAy A → ** | * 其中,S 是起始符号,x、y、* 都是终结符号,A 是非终结符号。 接下来,让我们来分析输入串 x*y(记为 α)。 我们可以使用自顶向下的语法分析方法,比如 LL(1) 分析器。 LL(1) 分析器使用一个预测分析表来分析输入串。预测分析表的行表示非终结符号,列表示终结符号,每个表格中的值表示应该使用哪个产生式进行展开。 为了使用 LL(1) 分析器,需要构建文法 G 的预测分析表。预测分析表包含了文法 G 所有的终结符号和非终结符号,以及每个组合的产生式。预测分析表的构建方法可以参考文献 [1]。 在这个文法中,我们可以看到 A 有两个产生式,即 A → ** 和 A → *,这样会导致预测分析表中的冲突。为了解决这个冲突,可以使用 LL(2) 分析器,或者对文法进行修改。 假设我们将文法修改为以下形式: S → xAy A → **B | * B → * | ε 这样,我们就可以构建出 LL(1) 预测分析表。预测分析表如下: | x | * | y | |-------|-------|-------| | S → xAy | | | | | A → * | | | | A → ** | | | | | | 接下来,我们可以使用这个预测分析表对输入串 x*y 进行分析。 分析过程如下: 1. 初始化分析栈,将起始符号 S 压入栈中。 Stack: S$ 2. 读入输入串的第一个字符,即 x。 Input: x*y 3. 从分析栈的栈顶取出一个符号 S。将预测分析表中 S 对应行、x 对应列的值取出。值为 S → xAy,将 Ay 压入栈中,并将 x 从输入串中取出。 Stack: Ay$ 4. 读入输入串的下一个字符,即 *。 Input: *y 5. 从分析栈的栈顶取出一个符号 A。将预测分析表中 A 对应行、* 对应列的值取出。值为 A → *,将 * 从输入串中取出。 Stack: *y$ 6. 读入输入串的下一个字符,即 y。 Input: y 7. 从分析栈的栈顶取出一个符号 *。将它从输入串中取出。 Stack: $ 8. 此时,分析栈为空,输入串也被消耗完毕。分析成功。 因此,我们可以得出结论:输入串 x*y 可以被文法 G(S) 接受。 希望我的回答对您有帮助! 参考文献: [1] Aho, A. V., & Ullman, J. D. (1972). The theory of parsing, translation and compiling (Vol. 1). Prentice-Hall.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值