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
*/
原文地址:https://www.cnblogs.com/cherish-lin/p/11589701.html