首先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
*/
知识兔