富豪凯匹配串
链接:https://ac.nowcoder.com/acm/contest/1114/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
有n个长度为m的文本串,每个串只含有'0'和'1'。接下来有Q次询问,每次给出一个长度为m的字符串,且只含有'0','1'和'_'。如10_1_1。下划线可以匹配'0'或'1'。即10_1_1可以匹配101111,101101,100111,100101四种串。每次询问求出n个文本串中有多少个可以与当前询问的串匹配。
输入描述:
第一行输入n,m
接下来n行,每行输入一个长度为m的01串表示一个文本串。
第n+2行输入Q
接下来Q行,每行输入一个长度为m的字符串(只包含'0','1','_')。
1<=n,m<=1000,1<=Q<=3000。
输出描述:
对于每次询问,输出n个文本串中有多少个与当前询问的串匹配。
思路:由于是0,1串。判断是否相匹配可以通过位运算相与。是'_'的时候,一定匹配成功。不是'_'的时候,要判断是否相等。
'_'可以匹配0或1,则表明不管对方是1或0都匹配成功,可以采用0相与,0与二进制数都为零。可以用bitset来优化。
#include <iostream> #include<bitset> #include<string> using namespace std; bitset<1006> b[1006],p,q; string s; int main() { int n,m; cin >> n >> m; for(int i=0;i<n;i++) { cin >> s; for(int j=0;j<s.size();j++) { if(s[j]=='0') b[i][j]=0; else b[i][j]=1; } } int Q; cin >> Q; while(Q--) { cin >> s; for(int j=0;j<s.size();j++) { if(s[j]=='_') q[j]=p[j]=0; else q[j]=1,p[j]=s[j]=='1'? 1:0; } int ans=0; for(int i=0;i<n;i++) { if((q&b[i])==p) ans++; } cout << ans << endl; } return 0; }