• F


    题目链接:http://codeforces.com/gym/100553/attachments/download/2885/20142015-acmicpc-northeastern-european-regional-contest-neerc-14-en.pdf

    首先bitset用法链接:https://www.cnblogs.com/magisk/p/8809922.html

    题解: 题目要判断哪个文本串是符合题意的.

    限制:此字符串包含的信息用二进制表示后,可以找到一个u[i]使得对于每一个a[j]  进行运算后次位上都标记为1.

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=1010;
    ll a[maxn],u[maxn];
    string str[1010];
    vector<int>v;
    bitset<1010>info[1010],now;//储存每一个u[i]对应的能满足f的二进制串
    
    string change(char x)//注意1转换为1000而不是0001,第一位为二进制的最低位,然后依次递推
    {
        if(x=='0') return (string)("0000");
        else if(x=='1') return (string)("1000");
        else if(x=='2') return (string)("0100");
        else if(x=='3') return (string)("1100");
        else if(x=='4') return (string)("0010");
        else if(x=='5') return (string)("1010");
        else if(x=='6') return (string)("0110");
        else if(x=='7') return (string)("1110");
        else if(x=='8') return (string)("0001");
        else if(x=='9') return (string)("1001");
        else if(x=='a') return (string)("0101");
        else if(x=='b') return (string)("1101");
        else if(x=='c') return (string)("0011");
        else if(x=='d') return (string)("1011");
        else if(x=='e') return (string)("0111");
        else return (string)("1111");
    }
    int main()
    {
        freopen("filter.in", "r", stdin);
        freopen("filter.out", "w", stdout);
        int m,f,n,q;
        cin>>m>>f;
        for(int i=1;i<=f;i++){
            cin>>a[i];
        }
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>str[i];
        }
        cin>>q;
        for(int i=1;i<=q;i++){//记录每个u[i]可转变为的二进制串
            cin>>u[i];
            info[i].reset();
            for(int j=1;j<=f;j++){
                int pos=u[i]*a[j]%m;
                info[i].set(pos,1);
            }
        }
        for(int i=1;i<=n;i++){
    
            string s;
            int len=str[i].size();
            for(int j=0;j<m/4;j++){
                s+=change(str[i][j]);
            }
            if(m%4){
                string w=change(str[i][len-1]);
                for(int j=0;j<m%4;j++){
                    s+=w[j];
                }
            }
            reverse(s.begin(),s.end());
            bitset<1010>ww(s);//ww记录当前文本串的二进制串信息
            for(int j=1;j<=q;j++){//题目要求:如果能找到一个u[i]使得每个f[j]运算后都标记为1,这个信息才是有记录的
                now=ww&info[j];//我们需要判断ww是否包含info[i],只需这样与运算一下即可,
                if(now.count()==info[j].count()){//然后判断一下1的个数是否相同
                    v.push_back(i-1);
                    break;
                }
            }
        }
        cout<<v.size()<<endl;
        for(int i=0;i<v.size();i++)
            cout<<v[i]<<' ';
        cout<<endl;
        return 0;
    }
    /*
    23 4 3 5 7 11
    3
    effde7
    c07902
    0800c1
    3 2 4 6
    */
  • 相关阅读:
    剑指offer55. 平衡二叉树
    剑指offer52. 两个链表的第一个公共节点
    LC1043. Partition Array for Maximum Sum
    剑指offer40. Top K
    剑指offer39. 数组中出现次数超过一半的数字
    剑指offer36.将BST原地转换为双向循环链表
    判断大小端
    CentOS安装RabbitMQ 3.8.9
    Nginx 413 Request Too Large 错误
    NginxPC端和移动端区分
  • 原文地址:https://www.cnblogs.com/cherish-lin/p/11589701.html
Copyright © 2020-2023  润新知