Description

几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户。最常见的通配符有两个,一个
是星号(“”’),可以匹配0个及以上的任意字符:另一个是问号(“?”),可以匹配恰好一个任意字符。
现在需要你编写一个程序,对于给定的文件名列表和一个包含通配符的字符串,判断哪些文件可以被匹配。

Input

第一行是一个由小写字母和上述通配符组成的字符串。
第二行包含一个整数n,表示文件个数。
接下来n行,每行为一个仅包含小写字母字符串,表示文件名列表。

Output

输出n行,每行为“YES”或“NO”,表示对应文件能否被通配符匹配。

Sample Input

*aca?ctc
6
acaacatctc
acatctc
aacacatctc
aggggcaacacctc
aggggcaacatctc
aggggcaacctct

Sample Output

YES
YES
YES
YES
YES
NO

HINT

对于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]通配符匹配的更多相关文章

  1. 「题解报告」 P3167 [CQOI2014]通配符匹配

    「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...

  2. BZOJ3507 [Cqoi2014]通配符匹配

    题意 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号("*"),可以匹配0个及以上的任意字符:另一个是问号(" ...

  3. P3167 [CQOI2014]通配符匹配 题解

    题目 题目大意 给出一个字符串,其中包含两种通配符 ‘?’和 ‘*’ ,‘?’可以代替一个字符,‘*’可以代替一个字符串(长度可以为0) 然后给出几个字符转,判断能否用给出的字符串表示出来 样例解释 ...

  4. BZOJ3507 [Cqoi2014]通配符匹配 【哈希 + 贪心】

    题目 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个 是星号(""'),可以匹配0个及以上的任意字符:另一个是问号(&quo ...

  5. [CQOI2014]通配符匹配

    Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(""'),可以匹配0个及以上的任意字符:另一个 ...

  6. 【bzoj3570】 Cqoi2014—通配符匹配

    http://www.lydsy.com/JudgeOnline/problem.php?id=3507 (题目链接) 题意 给出一个主串,里面有些通配符,'*'可以代替任意字符串或者消失,'?'可以 ...

  7. [BZOJ3507][CQOI2014]通配符匹配(DP+Hash)

    显然f[i][j]表示S匹配到第i个通配符,T匹配到第j个字符,是否可行. 一次一起转移两个通配符之间的所有字符,Hash判断. 稍微有点细节.常数极大卡时过排名倒数,可能是没自然溢出的原因. #in ...

  8. [bzoj3507 Cqoi2014]通配符匹配 (hash+DP)

    传送门 Solution 显然用哈希233 设\(f[i][j]\)表示第i个通配符和当前第j个字符是否匹配 考虑两种通配符的特性,直接转移即可 Code #include <cstdio> ...

  9. P3167 [CQOI2014]通配符匹配

    吐槽 本来是去写AC自动机的,然后发现数据范围每个串100000,有100个串(???),连塞进trie树里都塞不进去,玩个鬼的AC自动机啊,tag不要乱打啊 最后拿字符串hash+爆搜一发搜过去了. ...

随机推荐

  1. javascript格式化table标签内容

    项目中遇到这样的需求,一大段文章正文的html代码在手机中显示不全,原因是由于其它有table,而table表格中的tr/td都携带了从word中粘贴过来的样式,需要将这一大段的字符串中的table. ...

  2. zookeeper_service 出错 java.lang.NoClassDefFoundError: org/I0Itec/zkclient/exception/ZkNoNodeException

    2016-12-18 08:28:07 ContextLoader:358 ERROR - Context initialization failed java.lang.NoClassDefFoun ...

  3. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...

  4. java开发人员,最应该学习和熟练使用的工具类。google guava.(谷歌 瓜娃)

    学习参考文章: http://blog.csdn.net/wisgood/article/details/13297535 http://ifeve.com/google-guava/ http:// ...

  5. 【转】linux查看及修改文件权限以及相关

    linux查看及修改文件权限以及相关 查看文件权限的语句: 在终端输入: ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些: -rw-rw-r-- 一共有 ...

  6. 从SQL的视角用powershell

    SQL是数据处理中的利器,语法简单,表现力强.同时SQL作为说明型语言,让使用者关注在数据处理上.Powershell是微软提供的一个命令行工具.虽然在powershell中无法直接编写SQL,但是提 ...

  7. 使用 bash 创建定时任务

    假设要增加每分钟执行一次的检测任务 (crontab -l; echo "* * * * * python check.py") | crontab 在 centos 6 上, 注 ...

  8. <css系列>之css--float总结

    一.float的历史     float的设计初衷是实现文字环绕效果. 如下图,对图片添加float,文字实现环绕效果. 二.float特性     1.包裹性,表现:收缩.坚挺.隔绝.具有包裹性的属 ...

  9. ajax用get刷新页面元素在IE下无效解决~~

    总结一下解决办法: 在IE下用Ajax请求某一页面,通常会因为缓存的原因而返回上一次的结果,造成混乱,[即get方式时,获取数据,因发送参数和地址都一致,故IE浏览器会从缓存中取,而不会去请求服务器端 ...

  10. C+继承

    // 继承.cpp : Defines the entry point for the console application.// #include "stdafx.h" str ...