博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 3507 DP+哈希
阅读量:4557 次
发布时间:2019-06-08

本文共 2304 字,大约阅读时间需要 7 分钟。

[Cqoi2014]通配符匹配

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

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个字符能否匹配,然后搞搞转移,注意两种通配符的区别。

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 #define ULL unsigned long long 8 #define MAXN 100010 9 #define BASE 13110 char S[MAXN],s[MAXN];11 ULL hash[2][MAXN],bin[MAXN];12 int p[20],t,N;13 bool f[12][MAXN];14 inline void Hashtable(char str[],int opt)15 {16 int len=strlen(str+1);17 for (int i=1; i<=len; i++) hash[opt][i]=hash[opt][i-1]*BASE+str[i];18 }19 inline ULL GetHash(int l,int r,int opt)20 {21 return r>l? hash[opt][r]-hash[opt][l-1]*bin[r-l+1] : -1;22 }23 int main()24 {25 bin[0]=1; for (int i=1; i<=MAXN-1; i++) bin[i]=bin[i-1]*BASE;26 scanf("%s",S+1); Hashtable(S,0);27 int len=strlen(S+1);28 for (int i=1; i<=len; i++) if (S[i]=='*' || S[i]=='?') p[++t]=i;29 p[++t]=++len; S[len]='?';30 scanf("%d",&N);31 while (N--)32 {33 scanf("%s",s+1); Hashtable(s,1);34 memset(f,0,sizeof(f)); f[0][0]=1;35 int len=strlen(s+1); s[++len]='@';36 for (int i=0; i<=t-1; i++)37 {38 if (S[p[i]]=='*') for (int j=1; j<=len; j++) if (f[i][j-1]) f[i][j]=1;39 for (int j=0; j<=len; j++)40 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))41 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;42 }43 if (f[t][len]) puts("YES"); else puts("NO");44 }45 return 0;46 }

 

转载于:https://www.cnblogs.com/fengzhiyuan/p/8530839.html

你可能感兴趣的文章
【2019-09-10】美,真的跟年龄无关
查看>>
【2019-09-28】少,但更好
查看>>
【2019-09-13】耐心观察是一种技能
查看>>
mysql数据库2-常用命令
查看>>
安卓开发环境搭建(转)
查看>>
英语学习一周年
查看>>
Note
查看>>
以太网基础知识(一)-计算机网络
查看>>
set容器
查看>>
python基础学习目录
查看>>
微软必应地图加载错误:Uncaught TypeError: Microsoft.Maps.Location is not a constructor
查看>>
卷积神经网络是如何工作的(译文)
查看>>
微信开发 笔记1
查看>>
SQL server 删除日志文件 秒删
查看>>
MethodChannel 实现flutter 与 原生通信
查看>>
lua的性能优化
查看>>
vs2012 出现断点无法命中 解决方案。
查看>>
weex图片加载更多方法loadmore的使用
查看>>
创建您的 ActiveReports Web端在线报表设计器
查看>>
vue router-link 上添加点击事件
查看>>