bzoj 3507: [Cqoi2014]通配符匹配
Description
几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户。最常见的通配符有两个,一个
是星号(“”’),可以匹配0个及以上的任意字符:另一个是问号(“?”),可以匹配恰好一个任意字符。
现在需要你编写一个程序,对于给定的文件名列表和一个包含通配符的字符串,判断哪些文件可以被匹配。Input
第一行是一个由小写字母和上述通配符组成的字符串。
第二行包含一个整数n,表示文件个数。
接下来n行,每行为一个仅包含小写字母字符串,表示文件名列表。Output
输出n行,每行为“YES”或“NO”,表示对应文件能否被通配符匹配。
Sample Input
*aca?ctc
6
acaacatctc
acatctc
aacacatctc
aggggcaacacctc
aggggcaacatctc
aggggcaacctctSample Output
YES
YES
YES
YES
YES
NOHINT
对于1 00%的数据
·字符串长度不超过1 00000
·1 <=n<=100
·通配符个数不超过10
dp一下,设$f_{i,j}$表示匹配到第$i$个通配符,第$j$个字符是否可行
分*和?来递推
有一个小姿势,就是在原串和匹配串后面都加一个?,好像挺有用的..
mdzz hash天天被卡..
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define LL long long
using namespace std;
const LL Maxn = ;
const LL Mod = 1e9+;
bool f[][Maxn];
char s[Maxn], st[Maxn]; LL len, stl;
LL ps[Maxn], pst[Maxn], cf[Maxn];
LL hash ( LL *a, LL x, LL y ){
return (a[y]-(a[x-]*cf[y-x+])%Mod+Mod)%Mod;
}
LL pos[], pl, n;
int main (){
LL i, j, k;
scanf ( "%s", s+ );
len = strlen (s+);
cf[] = ;
for ( i = ; i <= ; i ++ ) cf[i] = (cf[i-]*)%Mod;
for ( i = ; i <= len; i ++ ){
if ( s[i] >= 'a' && s[i] <= 'z' ) ps[i] = ((ps[i-]*)%Mod+s[i]-'a')%Mod;
else {
ps[i] = (ps[i-]*)%Mod;
pos[++pl] = i;
}
}
ps[++len] = '?';
pos[++pl] = len;
scanf ( "%lld", &n );
while ( n -- ){
scanf ( "%s", st+ );
stl = strlen (st+);
for ( i = ; i <= stl; i ++ ) pst[i] = ((pst[i-]*)%Mod+st[i]-'a')%Mod;
st[++stl] = '?';
memset ( f, false, sizeof (f) );
f[][] = true;
for ( i = ; i <= pl; i ++ ){
if ( s[pos[i]] == '*' ){
for ( j = ; j <= stl; j ++ ){
if ( j-(pos[i]-pos[i-]) < ) continue;
if ( f[i-][j-(pos[i]-pos[i-])] == true ){
if ( pos[i] == pos[i-]+ ) break;
else if ( hash ( ps, pos[i-]+, pos[i]- ) == hash ( pst, j-(pos[i]-pos[i-])+, j- ) ) break;
}
}
for ( j = j-; j <= stl; j ++ ) f[i][j] = true;
}
else {
for ( j = ; j <= stl; j ++ ){
if ( j-(pos[i]-pos[i-]) < ) continue;
if ( f[i-][j-(pos[i]-pos[i-])] == true ){
if ( pos[i] == pos[i-]+ ) f[i][j] = true;
else if ( hash ( ps, pos[i-]+, pos[i]- ) == hash ( pst, j-(pos[i]-pos[i-])+, j- ) ) f[i][j] = true;
}
}
}
}
if ( f[pl][stl] == true ) printf ( "YES\n" );
else printf ( "NO\n" );
}
return ;
}
bzoj 3507: [Cqoi2014]通配符匹配的更多相关文章
- 「题解报告」 P3167 [CQOI2014]通配符匹配
「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...
- BZOJ3507 [Cqoi2014]通配符匹配
题意 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号("*"),可以匹配0个及以上的任意字符:另一个是问号(" ...
- P3167 [CQOI2014]通配符匹配 题解
题目 题目大意 给出一个字符串,其中包含两种通配符 ‘?’和 ‘*’ ,‘?’可以代替一个字符,‘*’可以代替一个字符串(长度可以为0) 然后给出几个字符转,判断能否用给出的字符串表示出来 样例解释 ...
- BZOJ3507 [Cqoi2014]通配符匹配 【哈希 + 贪心】
题目 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个 是星号(""'),可以匹配0个及以上的任意字符:另一个是问号(&quo ...
- [CQOI2014]通配符匹配
Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(""'),可以匹配0个及以上的任意字符:另一个 ...
- 【bzoj3570】 Cqoi2014—通配符匹配
http://www.lydsy.com/JudgeOnline/problem.php?id=3507 (题目链接) 题意 给出一个主串,里面有些通配符,'*'可以代替任意字符串或者消失,'?'可以 ...
- [BZOJ3507][CQOI2014]通配符匹配(DP+Hash)
显然f[i][j]表示S匹配到第i个通配符,T匹配到第j个字符,是否可行. 一次一起转移两个通配符之间的所有字符,Hash判断. 稍微有点细节.常数极大卡时过排名倒数,可能是没自然溢出的原因. #in ...
- [bzoj3507 Cqoi2014]通配符匹配 (hash+DP)
传送门 Solution 显然用哈希233 设\(f[i][j]\)表示第i个通配符和当前第j个字符是否匹配 考虑两种通配符的特性,直接转移即可 Code #include <cstdio> ...
- P3167 [CQOI2014]通配符匹配
吐槽 本来是去写AC自动机的,然后发现数据范围每个串100000,有100个串(???),连塞进trie树里都塞不进去,玩个鬼的AC自动机啊,tag不要乱打啊 最后拿字符串hash+爆搜一发搜过去了. ...
随机推荐
- Adaboost\GBDT\GBRT\组合算法
Adaboost\GBDT\GBRT\组合算法(龙心尘老师上课笔记) 一.Bagging (并行bootstrap)& Boosting(串行) 随机森林实际上是bagging的思路,而GBD ...
- php编译 :virtual memory exhausted: Cannot allocate memory
有时候用vps建站时需要通过编译的方式来安装主机控制面板.对于大内存的VPS来说一般问题不大,但是对于小内存,比如512MB内存的VPS来说,很有可能会出现问题,因为编译过程是一个内存消耗较大的动作. ...
- 项目vue2.0仿外卖APP(三)
项目的结构如下: 项目资源准备 准备项目的各种图片资源等等 注意:在webpack可以不用css sprite,直接用单张图片,因为它会帮忙打包. 还有SVG图片, ...
- java基础杂烩
1. int ... arg: 可变参数 2. 数组拷贝放在JDK中的System类中,arraycopy(原数组,从原数组那一个索引开始拷贝,目标数组,在目标数组哪一个位置开始粘贴,拷贝元素的个 ...
- WebForm控件--2016年12月29日
简单控件 1.Label => <span id="Label1">Label1</span> 2.Literal => Text 填 ...
- WebRTC的一个例子
内容引自:一个WebRTC实现获取内网IP的例子(穿透NAT) 网页代码直接复制到下面(如果以上链接被墙,可以直接将下面代码保存文件,然后在浏览器打开即可,不支持IE浏览器): <!doctyp ...
- php检测文件内容编码的方法
核心用到的是mb_convert_encoding函数,示例代码如下: <?php header("Content-type: text/html; charset=utf-8&quo ...
- Asp.Net 数据库连接字符串
<configuration> <connectionStrings> <add name="DefaultConnection" providerN ...
- jquery中on绑定事件
之前项目中动态创建的标签元素 在绑定事件的时候 都是无效 无论如何都不能触发 eg:在页面加载完成之后 再由脚本动态创建的<div>元素 在绑定事件的时候 例如click事件 ...
- 使用ajaxfileupload.js实现上传文件功能
<div class="pictureList"> <div class="pictureItem" id="uploadItem& ...