题目链接:点击查看

题目大意:给出一个长度为 n 的模式串 s ,再给出一个长度为 m 的匹配串,匹配串的每一位的可行数字都会给出,现在问最多可以匹配多少个字符串

题目分析:模式串和匹配串的匹配,AC自动机的经典问题,但是在这个题目中匹配串的个数过于多,所以并不能这样做,因为匹配串的长度比较短,所以可以预处理出一个可行数组用来记录哪个位置可以放置哪个数字,这样就能将时间复杂度优化为 n * m 暴力贪心匹配了,但是看数据范围可知,n 为 2e6 , m 为 800 ,显然出题人是有意卡掉这样的暴力匹配

考虑优化,其实我们可以使用 bitset 优化暴力,可以使得时空复杂度降低 64 个常数,优化方法非常巧妙:

首先就是利用 bitset 数组来充当可行数组,设其为 b 数组,即 bitset<800>b[ 10 ],则 b [ i ][ j ] = 1 代表第 j 个位置上允许放置数字 i,然后利用一个 bitset 变量记录每一次的匹配状态,记这个变量为 cur,cur 的含义是:模式串遍历到位置 i 时,cur 的第 j 位的状态代表着 [ i - j + 1 , i ] 这段区间是否和匹配串的前 j 个字符匹配,注意 cur 的每一位都是相互独立的

每一次对于 cur 的操作是,令其左移一位,再将第一个位置置为 1 ,设当前遍历到的数字为 num ,则接下来就令 cur &= b[ num ] ,因为 b[ num ] 中存放的二进制为 1 的位置代表着可以放置字符 num 的位置,所以在进行 “ 或 ” 运算后,cur 中仍然为 1 的位置 j 表示在第 [ i - j + 1 , j - 1 ] 这段区间与匹配串的前 j - 1 个字符匹配的基础上,第 j 个字符仍然匹配,所以根据动态规划的思想可以巧妙地将状态转移为 cur 的第 j  个位置也为 1

综上所述,每次只要 cur 的第 m 个位置为 1 时,就说明当前连续的 m 个字符匹配成功,答案加一且将 cur 清空

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e6+100;int a[N];bitset<810>b[10],cur,pre;int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%1d",a+i);for(int i=1;i<=m;i++) {int k;scanf("%d",&k);while(k--){int num;scanf("%d",&num);b[num][i]=1;}}int ans=0;for(int i=1;i<=n;i++){pre<<=1;pre[1]=1;cur=pre&b[a[i]];if(cur[m]){ans++;cur.reset();}pre=cur;}if(ans==0)puts("Failed to win the prize");elseprintf("%d\n",ans);return 0;
}

牛客 - Prize(bitset优化暴力)相关推荐

  1. 牛客多校2 - Greater and Greater(bitset优化暴力)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数组 a ,再给出一个长度最大为 m 的数组 b,现在问在 a 中所有长度为 m 的子数组中,有多少个子数组满足每个相应的元素都大于数组 b 题目分 ...

  2. “玲珑杯”ACM比赛 Round #24: C. この戦いが終わったら(BFS+bitset优化暴力)

    C -- この戦いが終わったら 给你一个无向图,每次查询的时候给一堆二元组(xi,yi) 求图中有多少个点u与至少一个这次询问给出的二元组(xi,yi)满足dist(u,xi)<=yi,dist ...

  3. [USACO18DEC]Cowpatibility(容斥 or bitset优化暴力)

    题面 题意: 给出n个五元组(一个五元组的五个数互不相同),我们称两个五元组不和谐,当且仅当任意元素都不相同,求有多少对五元组不和谐. \(Solution:\) 很容易想到 Ans = 总共对数-和 ...

  4. 牛客挑战赛47 C 条件(Floyd bitset优化)

    牛客挑战赛47 C 条件 思路:首先我们要两个图,一个是一定能到达的,一个是可能到达的,如果我们使用floyd (n^3)就有可能会超时,因为只要求询问能否到达,所以权值只有0和1,那我们可以使用bi ...

  5. 牛客 - Strange Bulbs(bitset优化拓扑)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的有向无环图,每个节点都有一个开关和一个灯泡,初始时节点 1 的灯泡是亮的,每次操作开关可以将当前灯泡的状态置反,且会对子节点的开关产生 ...

  6. C 简单瞎搞题(牛客练习赛22)(bitset优化dp)

    Bitset优化Dp 题目链接 一般DP做法 显然后面的数是与前面的数字相关的,所以我们有dp数组,dp[i][j]dp[i][j]dp[i][j]选取了jjj个数,iii是否可以被创造出来,如果可以 ...

  7. 2021牛客暑期多校训练营8 F-Robots(bitset优化dp)

    F-Robots 第一种第二种机器人直接O(n)O(n)O(n)判断即可. 第三种机器人暴力dp,用bitset优化. bitset<250005> b[i][j] 表示从(i,j)(i, ...

  8. 牛客小白月赛58 B(暴力)C(思维)D(dp滚动数组优化)

    牛客小白月赛58 感觉没什么意思,这场月赛出题人有点问题. B 题意:给定一定的数据填充顺序和每一个填充层的名称,只有填充满了上一层才可以填充下一层. 但是每一层又属于某一个大层,一个大层中包含了若干 ...

  9. 【牛客 - 368D】动态连通块(并查集+bitset优化)

    题干: 小T有n个点,每个点可能是黑色的,可能是白色的. 小T对这张图的定义了白连通块和黑连通块: 白连通块:图中一个点集V,若满足所有点都是白点,并且V中任意两点都可以只经过V中的点互相到达,则称V ...

最新文章

  1. Mybatis调用Oracle的存储过程
  2. python3下载文件-在Python 3中从web下载文件?
  3. 大工计算机基础在线作业答案,大工11春《计算机文化基础》在线作业及答案(国外英文资料).doc...
  4. 如何给小朋友解释单摆运动_运维挑战:如何构建复杂环境下的适应性系统
  5. 史上最全的面试宝典,让你轻松入职
  6. 51nod1394 差和问题 值域线段树
  7. paip.提升用户体验---c++ qt自定义窗体(2)---边框线的绘制
  8. 卡巴斯基终身免费用的方法
  9. 海湾5000汉字编码app
  10. python不知道吃什么_一个人不知道吃什么?找出我做的一个人的食物
  11. 《冰河世纪》特效指导罗皓做客【ftrack聊天室】
  12. 基于MPlayer的QT媒体播放器
  13. SQL查询语句可以执行,但是提示对象名无效
  14. 从 WWDC17 看苹果图形技术的革新
  15. java中的三种IO(BIO、NIO、AIO)
  16. QThread Qt
  17. 云米美国上市雷军系持股40% 陈小平:重新定义家的未来
  18. 2018年度锦鲤已出! 抽中奖的重点是什么?
  19. 中英互译在线翻译官方版
  20. 【SpringBoot】springboot日志配置

热门文章

  1. MySQL高级 - 锁 - MyISAM表锁 - 读锁
  2. ConcurrentHashMap的源码分析-为什么要做高低位的划分
  3. 数据库事务原理详解-事务的嵌套
  4. 通过反射运行配置文件内容
  5. 定义简单类-创建多个猫对象
  6. 顺序表查找+折半查找(二级)
  7. Java语法糖之foreach
  8. mac 由于网络问题,您已断开与 windows 计算机的联接.,苹果电脑启用windows系统时连接不上无线网怎么处理?...
  9. xxl-job 2.1.1执行器源码解读
  10. Shell文件的排序、合并和分割