题意

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

现在需要你编写一个程序,对于给定的文件名列表和一个包含通配符的字符串,判断哪些文件可以被匹配。

对于1 00%的数据,字符串长度不超过1 00000,1<=n<=100,通配符个数不超过10。

分析

参照DaD3zZ的题解。

感觉复杂度有点玄学的做法。DP+Hash

f[i][j]表示第i个通配符能否匹配到第j个位置。

因为一个*会把字符串分成两段,所以这个*分开的两边一定是要求一样的,这里可以利用hash判断。然后我们就可以得到通配符串被*分成好几段,这样就可以得到转移。枚举起点,如果可以匹配就可以转移。

有一些比较方便的处理,比如S最后加一个?,以及s最后加任意一个字符

这样的时间复杂度封顶大概是O(N∗k∗len),这个转移其实时间复杂度是不满的,所以可以AC

代码

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read()
{
rg T data=0;
rg int w=1;
rg char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
{
data=data*10+ch-'0';
ch=getchar();
}
return data*w;
}
template<class T>il T read(rg T&x)
{
return x=read<T>();
}
typedef unsigned long long ull; co int N=1e5+1,B=131;
char S[N],s[N];
ull hash[2][N],bin[N];
int p[20],t;
bool f[12][N]; void Hashtable(char str[],int opt)
{
int len=strlen(str+1);
for(int i=1;i<=len;++i)
hash[opt][i]=hash[opt][i-1]*B+str[i];
} ull GetHash(int l,int r,int opt)
{
return r>l?hash[opt][r]-hash[opt][l-1]*bin[r-l+1]:-1;
} int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
bin[0]=1;
for(int i=1;i<N;++i)
bin[i]=bin[i-1]*B;
scanf("%s",S+1);
Hashtable(S,0);
int len=strlen(S+1);
for(int i=1;i<=len;++i)if(S[i]=='*'||S[i]=='?')
p[++t]=i;
p[++t]=++len,S[len]='?';
int n=read<int>();
while(n--)
{
scanf("%s",s+1);
Hashtable(s,1);
memset(f,0,sizeof f);f[0][0]=1;
int len=strlen(s+1);s[++len]='@';
for(int i=0;i<=t-1;++i)
{
if(S[p[i]]=='*')
for(int j=1;j<=len;++j)
f[i][j]|=f[i][j-1];
for(int j=0;j<=len;++j)
if(f[i][j]&&GetHash(j+1,j+(p[i+1]-1)-(p[i]+1)+1,1)==GetHash(p[i]+1,p[i+1]-1,0))
{
if(S[p[i+1]]=='?')
f[i+1][j+(p[i+1]-1)-(p[i]+1)+1+1]=1;
else
f[i+1][j+(p[i+1]-1)-(p[i]+1)+1]=1;
}
}
puts(f[t][len]?"YES":"NO");
}
return 0;
}

BZOJ3507 [Cqoi2014]通配符匹配的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ-3507】通配符匹配 DP + Hash

    3507: [Cqoi2014]通配符匹配 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 372  Solved: 156[Submit][Statu ...

  5. 【BZOJ3507】通配符匹配(哈希,动态规划)

    [BZOJ3507]通配符匹配(哈希,动态规划) 题面 BZOJ 题解 对于匹配唯一存在影响的只有通配符,而\(?\)的影响也并不大,所以唯一需要仔细考虑的是\(*\). 考虑一个\(dp\),设\( ...

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

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

  7. bzoj 3507: [Cqoi2014]通配符匹配

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

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

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

  9. [CQOI2014]通配符匹配

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

随机推荐

  1. spring的几个通知(前置、后置、环绕、异常、最终)

    1.没有异常的 2.有异常的 1.被代理类接口Person.java package com.xiaostudy; /** * @desc 被代理类接口 * * @author xiaostudy * ...

  2. aliyun阿里云Maven仓库地址——加速你的maven构建 - 转载

    maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度提升100倍. http://maven.aliyun.com/nexus/#view-reposito ...

  3. java可变参数列表的实现

    参数就是我们调用一个方法时需要传入得数据,在方法中可能需要参数协助处理数据或者对参数进行解析处理以达到我们希望得到的数据和结果. 平常我们在写一个方法时,我们能确定需要传入什么样的参数以及参数的个数, ...

  4. 《Computational Statistics with Matlab》硬译

    第1章 从随机变量采样 研究者提出的概率模型对于分析方法来说通常比较复杂,研究者处理复杂概率模型时越来越依赖计算.数值方法,通过使用计算方法,研究者就不用对一些分析技术做一些不现实的假设(如正态性和独 ...

  5. NumPy使用 Matplotlib 绘制直方图

    NumPy - 使用 Matplotlib 绘制直方图 NumPy 有一个numpy.histogram()函数,它是数据的频率分布的图形表示. 水平尺寸相等的矩形对应于类间隔,称为bin,变量hei ...

  6. 落地案例|日本雅虎如何在 OpenStack 上大规模构建和运行 Kubernetes

    今天的帖子是由日本雅虎的基础设施工程团队撰写,内容是他们如何在 Kubernetes 上运行 OpenStack.这篇帖子是由日本雅虎的工程博客编译而来. 简介: 这篇帖子大致描述了日本雅虎在 Goo ...

  7. 一些官方的github地址

    阿里巴巴开源github地址:https://github.com/alibaba 腾讯开源github地址:https://github.com/Tencent 奇虎360github地址:http ...

  8. Oracle操作ORA-02289: 序列不存在

    解决方案:实现创建序列,创建语句如下所示: create sequence employees_seq minvalue maxvalue start increment cache ; 这时候再执行 ...

  9. asp.net core mvc中如何把二级域名绑定到特定的控制器上

    由于公司的工作安排,一直在研究其他技术,所以一直没时间更新博客,今天终于可以停下手头的事情,写一些新内容了. 应用场景:企业门户网站会根据内容不同,设置不同的板块,如新浪有体育,娱乐频道,等等.有的情 ...

  10. request方法传入动态参数的一个"误区"

    晚上写了一个请求类,传了一个动态参数进去,实例化测试的时候,发现请求数据根本没法读到,先附上代码 import requests class MyRequests: def send_request( ...