JZOJ 3600. 【CQOI2014】通配符匹配
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】通配符匹配相关推荐
- [CQOI2014]通配符匹配
https://www.zybuluo.com/ysner/note/1311407 题面 几乎所有操作系统的命令行界面\((CLI)\)中都支持文件名的通配符匹配以方便用户. 最常见的通配符有两个, ...
- bzoj3507: [Cqoi2014]通配符匹配
这题一眼看上去像是KMP...莫名旁边的zzz说是ACMachine,而且是真的有dalao用这个做... 然后呢经过%羊神的题解呢,发现居然是DP+hash字符串比较,但是时间复杂度就很差了(ran ...
- 刻意练习:LeetCode实战 -- Task30.通配符匹配
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...
- leetcode:44. 通配符匹配
给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串完全匹配才算 ...
- LeetCode 43字符串相乘44通配符匹配
原创公众号:bigsai,回复进群加入力扣打卡群. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形 ...
- 困难动态规划系列、经典的正则表达式和通配符匹配问题(难题)
2020/10/24. 周六.今天又是奋斗的一天. 正则表达式(Regular Expression, RE)就是一组定义某种搜索模式(pattern)的字符. 文章目录 Leetcode 10 正则 ...
- 通配符 不是jpg 结尾文件_Struts(十九)- 使用使用通配符匹配
学习到目前为止,add,show, list分别需要进行配置 通过通配符匹配可以把这3个配置整合在一个配置中实现 步骤1:先运行,看到效果,再学习步骤2:模仿和排错步骤3:struts.xml步骤4: ...
- 【数据结构与算法】之深入解析“通配符匹配”的求解思路与算法示例
一.题目要求 给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串完 ...
- 44. Wildcard Matching 通配符匹配
Title 给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串完全 ...
- 洛谷P4173:残缺的字符串(FFT、通配符匹配)
解析 通配符匹配的经典题. 设单词串为 AAA,文章串为 BBB. 把 AAA 翻转一下,判断问题就能转化为一个卷积的形式: F(p)=&i=0m−1match(Ai+1,Bp−i)F(p)= ...
最新文章
- 羊皮卷的故事-第二章
- 浏览器中的标签切换事件
- 实时监控fps的linux代码,GitHub - Forec/monitor-recorder: Monitor (实时视频监控、运动检测视频记录)...
- libevent源码学习-----事件驱动流程分析
- 模拟实现顺序表ArrayList1(三级)
- Spring Cloud自定义Hystrix请求命令
- 【LeetCode 剑指offer刷题】特殊数题3:204 Count Primes
- JS清除字符串中重复的值
- cad户型图练习_我的房子我做主 篇一:技多不压身—业内人士手把手教你学会用CAD绘制户型图...
- 计算机软硬件的组成及主要技术指标,计算机软硬件系统的组成及主要技术指标...
- 巴比特 | 元宇宙每日必读:42.46%的人年薪超过20万,元宇宙人才没有想象中的金贵?...
- 小丁带你走进git世界一-git简单配置
- 复赛后第一次正经写博客
- 微信公众号开发实战 | 01:环境配置
- 分布式微服务企业快速架构之SpringCloud分布式、微服务、云架构快速开发平台
- 短视频挺进在线音乐腹地
- 分享一下刚学会的,阿里矢量图在线引入的方法
- 力控批量添加变量_力控常见问题大全
- 机器视觉系统的眼睛:工业相机
- python教程、自学python的笔记整理
热门文章
- numpy版本不对应导致tensorflow出错
- 【CSDN】Markdown 如何画分界线
- 台湾大学林轩田机器学习基石课程学习笔记5 -- Training versus Testing
- 在 C++ 中实现一个轻量的标记清除 gc 系统
- javascript闭包产生的内存泄漏
- c++反射机制(vcl实现),mfc可依样实现
- “sql2005管道的另一端上无任何进程”及附带一系列问题完整解决方法
- git clone -b master https://github.com/hyperledger/fabric-samples.git
- why-use-getters-and-setters
- Object的finalize方法