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+爆搜一发搜过去了. ...
随机推荐
- 深入理解android:id以及@+id/name和@id/name的区别联系
今天为了好好研究了下@+id/name和@id/name的区别以及联系,又翻了翻文档/guide/topics/resources/layout-resource.html中关于 android:id ...
- Sicily 1150: 简单魔板(BFS)
此题可以使用BFS进行解答,使用8位的十进制数来储存魔板的状态,用BFS进行搜索即可 #include <bits/stdc++.h> using namespace std; int o ...
- Android学习资料收集
1.Android 学习之路 http://stormzhang.com/android/2014/07/07/learn-android-from-rookie/
- javascript中的变量
变量 var x = 0; 这是声明了一个变量的实例,我们可以把变量看做存储数据的容器.数据的类型可以是任何数据类型. 一变量的命名 声明一个变量需注意: ①:变量可以以字母或者$._开头(后两 ...
- Memcache的增删改查
Memcache是把数据存放到内存的一种缓存技术,为了提高访问的速度,memcache存储的数据一般是频繁.不太重要的数据,php使用memcache,需要两步: (1).php_memcache.d ...
- 解决pip安装超时
我们在使用python开发的时候总会需要安装很多第三方模块 比如我用flask搭建web, 需要很多第三方模块,比如flask-sqlalchemy, flask-bootstrap等等.而这些模块用 ...
- centos 编程环境
1,老毛桃/大白菜, iso制作将镜像文件写入u盘2, 安装,修改安装源路径 (手动修改为你的u盘dev)一般为sdb43, 安装时选择桌面安装 4, 更改安装源cd /etc/yum.repos ...
- django 强制登录最佳实践
参考: https://python-programming.courses/recipes/django-require-authentication-pages/ 即通过中间件来做AOP拦截.不用 ...
- 手写一个allocator
似乎就像是一个计算机原理的实践.. 首先介绍一下大多数操作系统的内存架构..对于某个程序它会认为自己是独占了整个系统的所有内存在运行的这样才能方便移植,因此人们搞出了虚拟内存和物理内存的区别,于是人们 ...
- java--连接SQL数据库获取验证码
1.导入SQL相关的包: 可以下载:mysql-connector-java-5.1.39-bin.jar 将包导入到工程的方法:project(在工程名上点鼠标右键) -> Build Pat ...