Description

Input

Output

Sample Input

*abc?e**e

3 abcee

ppabcqexe

abcdefgee

Sample Output

NO

YES

YES

Data Constraint

Solution

  • 由于通配符个数不超过10,考虑DP。

  • 设包含通配符的串为 SS ,要匹配的没有通配符的串为 TT 。

  • 设 f[i][j]f[i][j] 表示在 SS 中做到第 ii 个通配符、在 TT 中匹配到第 jj 个字符 是否可行

  • 那么我们先预处理出字符串的前缀的哈希值(用自然溢出),

  • 这样就可以很方便直接提取字符串的一个区间了。

  • 接着我们在就直接开始转移即可。

  • 注意通配符“∗*”可以完全匹配一整段(循环整段赋值),

  • 而如果是“??” 转移的时候就要多匹配一位(因为至少要匹配一位)。

  • 时间复杂度 O(T∗10∗|S|)O(T*10*|S|) 。

Code

#include<cstdio>
#include<cstring>
using namespace std;
typedef unsigned long long ULL;
const int N=1e5+5;
const ULL M=1e9+7;
int T,n,num,m;
int p[12];
ULL hs[N],ht[N],g[N];
bool f[12][N];
char s[N],t[N];
inline ULL hashs(int l,int r){return hs[r]-hs[l-1]*g[r-l+1];}
inline ULL hasht(int l,int r){return ht[r]-ht[l-1]*g[r-l+1];}
int main()
{freopen("3.in","r",stdin);scanf("%s",s+1),n=strlen(s+1),s[++n]='?';for(int i=1;i<=n;i++){hs[i]=hs[i-1]*M+s[i];if(s[i]=='*' || s[i]=='?') p[++num]=i;}for(int i=g[0]=1;i<N;i++) g[i]=g[i-1]*M;scanf("%d",&T);while(T--){scanf("%s",t+1),m=strlen(t+1),t[++m]='$';for(int i=1;i<=m;i++) ht[i]=ht[i-1]*M+t[i];memset(f,false,sizeof(f));f[0][0]=true;for(int i=0;i<num;i++){if(s[p[i]]=='*')for(int j=1;j<=m;j++)if(f[i][j-1]) f[i][j]=true;for(int j=0,len=p[i+1]-p[i];j<=m-len+1;j++)if(f[i][j] && hashs(p[i]+1,p[i+1]-1)==hasht(j+1,j+len-1))f[i+1][j+len-(s[p[i+1]]!='?')]=true;}puts(f[num][m]?"YES":"NO");}return 0;
}

JZOJ 3600. 【CQOI2014】通配符匹配相关推荐

  1. [CQOI2014]通配符匹配

    https://www.zybuluo.com/ysner/note/1311407 题面 几乎所有操作系统的命令行界面\((CLI)\)中都支持文件名的通配符匹配以方便用户. 最常见的通配符有两个, ...

  2. bzoj3507: [Cqoi2014]通配符匹配

    这题一眼看上去像是KMP...莫名旁边的zzz说是ACMachine,而且是真的有dalao用这个做... 然后呢经过%羊神的题解呢,发现居然是DP+hash字符串比较,但是时间复杂度就很差了(ran ...

  3. 刻意练习:LeetCode实战 -- Task30.通配符匹配

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  4. leetcode:44. 通配符匹配

    给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串完全匹配才算 ...

  5. LeetCode 43字符串相乘44通配符匹配

    原创公众号:bigsai,回复进群加入力扣打卡群. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形 ...

  6. 困难动态规划系列、经典的正则表达式和通配符匹配问题(难题)

    2020/10/24. 周六.今天又是奋斗的一天. 正则表达式(Regular Expression, RE)就是一组定义某种搜索模式(pattern)的字符. 文章目录 Leetcode 10 正则 ...

  7. 通配符 不是jpg 结尾文件_Struts(十九)- 使用使用通配符匹配

    学习到目前为止,add,show, list分别需要进行配置 通过通配符匹配可以把这3个配置整合在一个配置中实现 步骤1:先运行,看到效果,再学习步骤2:模仿和排错步骤3:struts.xml步骤4: ...

  8. 【数据结构与算法】之深入解析“通配符匹配”的求解思路与算法示例

    一.题目要求 给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串完 ...

  9. 44. Wildcard Matching 通配符匹配

    Title 给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串完全 ...

  10. 洛谷P4173:残缺的字符串(FFT、通配符匹配)

    解析 通配符匹配的经典题. 设单词串为 AAA,文章串为 BBB. 把 AAA 翻转一下,判断问题就能转化为一个卷积的形式: F(p)=&i=0m−1match(Ai+1,Bp−i)F(p)= ...

最新文章

  1. 羊皮卷的故事-第二章
  2. 浏览器中的标签切换事件
  3. 实时监控fps的linux代码,GitHub - Forec/monitor-recorder: Monitor (实时视频监控、运动检测视频记录)...
  4. libevent源码学习-----事件驱动流程分析
  5. 模拟实现顺序表ArrayList1(三级)
  6. Spring Cloud自定义Hystrix请求命令
  7. 【LeetCode 剑指offer刷题】特殊数题3:204 Count Primes
  8. JS清除字符串中重复的值
  9. cad户型图练习_我的房子我做主 篇一:技多不压身—业内人士手把手教你学会用CAD绘制户型图...
  10. 计算机软硬件的组成及主要技术指标,计算机软硬件系统的组成及主要技术指标...
  11. 巴比特 | 元宇宙每日必读:42.46%的人年薪超过20万,元宇宙人才没有想象中的金贵?...
  12. 小丁带你走进git世界一-git简单配置
  13. 复赛后第一次正经写博客
  14. 微信公众号开发实战 | 01:环境配置
  15. 分布式微服务企业快速架构之SpringCloud分布式、微服务、云架构快速开发平台
  16. 短视频挺进在线音乐腹地
  17. 分享一下刚学会的,阿里矢量图在线引入的方法
  18. 力控批量添加变量_力控常见问题大全
  19. 机器视觉系统的眼睛:工业相机
  20. python教程、自学python的笔记整理

热门文章

  1. numpy版本不对应导致tensorflow出错
  2. 【CSDN】Markdown 如何画分界线
  3. 台湾大学林轩田机器学习基石课程学习笔记5 -- Training versus Testing
  4. 在 C++ 中实现一个轻量的标记清除 gc 系统
  5. javascript闭包产生的内存泄漏
  6. c++反射机制(vcl实现),mfc可依样实现
  7. “sql2005管道的另一端上无任何进程”及附带一系列问题完整解决方法
  8. git clone -b master https://github.com/hyperledger/fabric-samples.git
  9. why-use-getters-and-setters
  10. Object的finalize方法