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+爆搜一发搜过去了. ...
随机推荐
- 优先队列实现Huffman编码
首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...
- vue.js的一些知识点
1. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- linux git实现代理
说明 Git 目前支持的三种协议 git://.ssh:// 和 http://,使用git:// 和 http://比较多,ssh://忽略,FQ后可以直接加快同步google和github代码. ...
- 《转载》跟我学spring3
一.<跟我学spring3>电子书下载地址: <跟我学spring3> (1-7 和 8-13) http://jinnianshilongnian.iteye.com/bl ...
- 重视blog备份——兼记我与CSDN的爱恨情仇
痛定思痛,终于决定--逐渐备份.迁移CSDN博客到"博客园". 缘起 前几年比较喜欢逛csdn的bbs,虽然之前在cnblogs也注册了账号,但一直用CSDN博客比较多.本来一直用 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- Python 小爬虫流程总结
接触Python3一个月了,在此分享一下知识点,也算是温故而知新了. 接触python之前是做前端的.一直希望接触面能深一点.因工作需求开始学python,几乎做的都是爬虫..第一个demo就是爬取X ...
- Oracle中使用REGEXP_SUBSTR,regexp_replace函数
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...
- [转]程序员趣味读物:谈谈Unicode编码
from : http://pcedu.pconline.com.cn/empolder/gj/other/0505/616631_all.html#content_page_1 这是一篇程序员写给程 ...
- wpf的UserControl用户控件怎么添加到Window窗体中
转载自 http://www.cnblogs.com/shuang121/archive/2013/01/09/2853591.html 我们来新建一个用户控件UserControl1.xaml &l ...