[Cqoi2014]通配符匹配

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 541  Solved: 235
[Submit][Status][Discuss]

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

Source

DP+哈希

f[i][j]表示第i个通配符和第j个字符能否匹配,然后搞搞转移,注意两种通配符的区别。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ULL unsigned long long
#define MAXN 100010
#define BASE 131
char S[MAXN],s[MAXN];
ULL hash[][MAXN],bin[MAXN];
int p[],t,N;
bool f[][MAXN];
inline void Hashtable(char str[],int opt)
{
int len=strlen(str+);
for (int i=; i<=len; i++) hash[opt][i]=hash[opt][i-]*BASE+str[i];
}
inline ULL GetHash(int l,int r,int opt)
{
return r>l? hash[opt][r]-hash[opt][l-]*bin[r-l+] : -;
}
int main()
{
bin[]=; for (int i=; i<=MAXN-; i++) bin[i]=bin[i-]*BASE;
scanf("%s",S+); Hashtable(S,);
int len=strlen(S+);
for (int i=; i<=len; i++) if (S[i]=='*' || S[i]=='?') p[++t]=i;
p[++t]=++len; S[len]='?';
scanf("%d",&N);
while (N--)
{
scanf("%s",s+); Hashtable(s,);
memset(f,,sizeof(f)); f[][]=;
int len=strlen(s+); s[++len]='@';
for (int i=; i<=t-; i++)
{
if (S[p[i]]=='*') for (int j=; j<=len; j++) if (f[i][j-]) f[i][j]=;
for (int j=; j<=len; j++)
if (f[i][j] && GetHash(j+,j+(p[i+]-)-(p[i]+)+,)==GetHash(p[i]+,p[i+]-,))
if (S[p[i+]]=='?') f[i+][j+(p[i+]-)-(p[i]+)++]=; else f[i+][j+(p[i+]-)-(p[i]+)+]=;
}
if (f[t][len]) puts("YES"); else puts("NO");
}
return ;
}

最新文章

  1. 【C#附源码】数据库文档生成工具支持(Excel+Html)
  2. git
  3. WPF筛选、排序和分组
  4. C# 中正确实现 IDisposable 接口
  5. Socket网络编程(2)--服务端实现
  6. sqoop导入数据到hive---2
  7. 203. Segment Tree Modify
  8. ♫【模式】Curry化
  9. 还在用ListView?
  10. 用php逐行读取文件
  11. oracle数据库管理系统常见的错误(一)
  12. Java问题解决:使用maven install 和 package时出错
  13. [设计模式] javascript 之 命令模式
  14. 重新粗推了一下Master Theorem
  15. nginx-1.12.1编译参数详情
  16. vue打包后出现&quot;Failed to load resource: net::ERR_FILE_NOT_FOUND&quot;错误
  17. VS2010配置OpenGL开发环境
  18. 文章翻译:Recommending items to more than a billion people(面向十亿级用户的推荐系统)
  19. spring框架中的@Import注解
  20. 用Eclipse平台进行C/C++开发

热门文章

  1. tcl之array操作
  2. windows下使用curl.exe模拟ajax请求
  3. 超简单开发自己的php框架一点都不难
  4. 【机器学习算法基础+实战系列】SVM
  5. 数据库中where与having的区别
  6. POJ:3292-Semi-prime H-numbers(艾氏筛选法拓展)
  7. POJ :3614-Sunscreen
  8. Mysql处理海量数据时的一些优化查询速度方法【转】
  9. Div处理滚动条问题
  10. python 表格存取方法(转)