富豪凯匹配串

链接:https://ac.nowcoder.com/acm/contest/1114/C
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制: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个文本串中有多少个与当前询问的串匹配。
示例1

输入

复制
5 6
101101
011011
100110
111000
101111
2
1011_1
1__1__

输出

复制
2
3

说明

第一次询问:有101101,101111与1011_1匹配
第二次询问:有101101, 100110, 101111与1__1__匹配
 
 
思路:由于是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;
}

 

posted @ 2019-10-17 22:33  晴天要下雨  阅读(337)  评论(0编辑  收藏  举报