[BZOJ3507]通配符匹配
3507: [Cqoi2014]通配符匹配
Time Limit: 10 Sec Memory Limit: 128 MB
Description
几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户。最常见的通配符有两个,一个
是星号(“”’),可以匹配0个及以上的任意字符:另一个是问号(“?”),可以匹配恰好一个任意字符。
现在需要你编写一个程序,对于给定的文件名列表和一个包含通配符的字符串,判断哪些文件可以被匹配。
Input
第一行是一个由小写字母和上述通配符组成的字符串。
第二行包含一个整数n,表示文件个数。
接下来n行,每行为一个仅包含小写字母字符串,表示文件名列表。
Output
输出n行,每行为“YES”或“NO”,表示对应文件能否被通配符匹配。
Sample Input
6
acaacatctc
acatctc
aacacatctc
aggggcaacacctc
aggggcaacatctc
aggggcaacctct
Sample Output
YES
YES
YES
YES
NO
HINT
对于1 00%的数据
·字符串长度不超过1 00000
· 1 <=n<=100
·通配符个数不超过10
题解:
考场打暴力打炸了……
不过在后来改题的时候我发现了暴力思路的一个大问题……我们还是直接讲正解吧
题目给的通配符有2种,一种是’*’,它可以伸展;一种是‘?’,它的长度固定;
不难发现,给我们的处理带来难度的是'*',因为他的长度不确定;
但转念一想,如果除了*,其他的都能匹配,那*也就能匹配了.
注意到通配符个数<=10,那么我们可以先按照*,把原串分成一些包含'?'和字母的段.
而对于每一段,只要其中的所有小字符串成功匹配,并且符合'?'对长度的要求,这一段就匹配成功了
所以我们再在每一段里,按照'?'再分为几小块只含字母的串,并且分别求出hash值;同时求出文本串的hash值.
在匹配的时候,对于某一段,枚举起点,看在这一段在哪里可以匹配.
由于对于段间的枚举,影响因素只有*,所以匹配点肯定越靠前越好,因此这里可以贪心,即找到最靠前的匹配点即可停止.
而对于段内比较,利用刚才求的hash值比较就好.
代码见下:
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<string>
- using namespace std;
- typedef unsigned long long LL;
- const int N=;
- const int mod1=;
- int n,lens,len,cnt,cnt1[];
- char s[N],text[N];
- LL block[][],h[N],mi[N];
- int l[][],num[];
- inline LL g_hash(int l,int r){return h[r]-h[l-]*mi[r-l+];}
- inline bool match(int i,int k)
- {
- for(int j=;j<=num[k];j++)
- {
- if(l[k][j]==){i++;continue;}
- if(block[k][j]!=g_hash(i,i+l[k][j]-))return ;
- i+=l[k][j]+;
- }
- return ;
- }
- bool judge()
- {
- if(!cnt)
- {
- if(len!=lens)return ;
- for(int i=;i<=len;i++)
- if(s[i]!=text[i]&&s[i]!='?')return ;
- return ;
- }
- if(len<(cnt1[]-)+(lens-cnt1[cnt]))return ;
- for(int i=;i<cnt1[];i++)if(s[i]!=text[i]&&s[i]!='?')return ;
- for(int i=lens,j=len;i>cnt1[cnt];i--,j--)if(s[i]!=text[j]&&s[i]!='?')return ;
- for(int i=;i<=len;i++)
- h[i]=h[i-]*mod1+text[i];
- int i=cnt1[],line=len-(lens-cnt1[cnt])+;
- for(int k=;k<=cnt;k++)
- {
- for(;i<=line;i++)
- if(match(i,k))break;
- i+=cnt1[k]-cnt1[k-]-;
- if(i>line)return ;
- }
- return ;
- }
- int main()
- {
- scanf("%s",s+);lens=strlen(s+);
- mi[]=;for(int i=;i<=lens;i++)mi[i]=mi[i-]*mod1;
- for(int i=;i<=lens;i++)
- if(s[i]=='*')cnt1[++cnt]=i;
- for(int i=;i<=cnt;i++)
- {
- num[i]=;
- for(int j=cnt1[i-]+;j<cnt1[i];j++)
- {
- if(s[j]=='?'){num[i]++;continue;}
- l[i][num[i]]++;
- block[i][num[i]]=block[i][num[i]]*mod1+s[j];
- }
- }
- scanf("%d",&n);
- for(int i=;i<=n;i++)
- {
- scanf("%s",text+);len=strlen(text+);
- if(judge())printf("YES\n");
- else printf("NO\n");
- }
- }
BZOJ3507
[BZOJ3507]通配符匹配的更多相关文章
- [CQOI2014][bzoj3507] 通配符匹配 [字符串hash+dp]
题面 传送门 思路 0x01 KMP 一个非常显然而优秀的想法:把模板串按照'*'分段,然后对于每一段求$next$,'?'就当成可以对于任意字符匹配就行了 对于每个文本串,从前往后找第一个可以匹配的 ...
- 【BZOJ3507】通配符匹配(哈希,动态规划)
[BZOJ3507]通配符匹配(哈希,动态规划) 题面 BZOJ 题解 对于匹配唯一存在影响的只有通配符,而\(?\)的影响也并不大,所以唯一需要仔细考虑的是\(*\). 考虑一个\(dp\),设\( ...
- 【BZOJ-3507】通配符匹配 DP + Hash
3507: [Cqoi2014]通配符匹配 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 372 Solved: 156[Submit][Statu ...
- BZOJ3507 [Cqoi2014]通配符匹配
题意 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号("*"),可以匹配0个及以上的任意字符:另一个是问号(" ...
- BZOJ3507 [Cqoi2014]通配符匹配 【哈希 + 贪心】
题目 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个 是星号(""'),可以匹配0个及以上的任意字符:另一个是问号(&quo ...
- bzoj 3507: [Cqoi2014]通配符匹配
Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(“”’),可以匹配0个及以上的任意字符:另一个是问号(“?”),可 ...
- [Swift]LeetCode44. 通配符匹配 | Wildcard Matching
Given an input string (s) and a pattern (p), implement wildcard pattern matching with support for '? ...
- LeetCode(44): 通配符匹配
Hard! 题目描述: 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). ...
- [LeetCode][Facebook面试题] 通配符匹配和正则表达式匹配,题 Wildcard Matching
开篇 通常的匹配分为两类,一种是正则表达式匹配,pattern包含一些关键字,比如'*'的用法是紧跟在pattern的某个字符后,表示这个字符可以出现任意多次(包括0次). 另一种是通配符匹配,我们在 ...
随机推荐
- macOS 10.14 Mojave 开发环境配置Apache多PHP版本
第1部分:macOS 10.14 Mojave Web开发环境 在macOS上开发Web应用程序真是一种乐趣.设置开发环境有很多选择,包括广受欢迎的MAMP Pro,它在Apache,PHP和MySQ ...
- golang 单元测试
单元测试是质量保证十分重要的一环,好的单元测试不仅能及时地发现问题,更能够方便地调试,提高生产效率.所以很多人认为写单元测试是需要额外的时间,会降低生产效率,是对单元测试最大的偏见和误解. go 语言 ...
- Python 装饰器备忘
def deco(attr): ''' 装饰器,共包含三层返回结构 \n 第一层:用于接收 @deco 的参数,此处的代码只在初始化装饰器时执行一次 \n 第二层:用于接收 function,此处的代 ...
- Jenkins配置 管理
Jenkins配置 你可能已经看了前面几次练习了,其中我们不得不在Jenkins配置选项.下表列出了Jenkins 的各种配置选项. 因此,可以通过点击左侧菜单侧的 “Manage Jenkins”选 ...
- Java飞机大战MVC版
PlaneWar Java飞机大战MVC版 //无聊时偷的雷霆战机素材写了一个飞机大战,本意是练习mvc,但写得还是不清晰 github下载:https://github.com/dejavudwh/ ...
- 详解Python中的下划线
本文将讨论Python中下划线(_)字符的使用方法.我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯例而已. 单下划线(_) 通常情况下,会在以下3种场景中使用 ...
- 【转】SWFUpload使用指南
原文出自:http://www.runoob.com/w3cnote/swfupload-guide.html SWFUpload是一个flash和js相结合而成的文件上传插件,其功能非常强大.以前在 ...
- Scrum立会报告+燃尽图(十月二十九日总第二十次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2288 项目地址:https://git.coding.net/zhang ...
- Beta阶段第一次网络会议
Beta阶段第一次网络会议 游戏问题 游戏细节特征不够明显,大小虽然随着电脑分辨率的不同变化着,但是存在清楚的问题 游戏中的提示信息不够,玩家无法快速了解游戏 游戏中背景声音过于单一 游戏AI太简单 ...
- Android开发第二阶段(6)
今天:对sdcard的操作有了进一步的了解和深入,为程序可以自主扫描并添加sdcard的MP3格式文件 明天:最后的修正.