吐槽

本来是去写AC自动机的,然后发现数据范围每个串100000,有100个串(???),连塞进trie树里都塞不进去,玩个鬼的AC自动机啊,tag不要乱打啊

最后拿字符串hash+爆搜一发搜过去了。。。

思路

挺恶心的搜索吧

考虑分段,按?号和*号分段,对于每段内的hash判断是否一致,*号和?号按题意处理即可

然后边界不要写挂就好了

代码

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int base=131;
  6. int xing[100100],wen[100100],n,lens,cntx,cntw,lent;
  7. unsigned long long hashs1[100100],hashs2[100100],pow[100100];
  8. char s[100100],t[100100];
  9. void init(void){
  10. pow[0]=1;
  11. for(int i=1;i<=100001;i++)
  12. pow[i]=pow[i-1]*base;
  13. }
  14. unsigned long long hash1(int l,int r){
  15. return hashs1[r]-hashs1[l-1]*pow[r-l+1];
  16. }
  17. unsigned long long hash2(int l,int r){
  18. return hashs2[r]-hashs2[l-1]*pow[r-l+1];
  19. }
  20. bool dfs(int poss,int post){
  21. // printf("%d %d\n",poss,post);
  22. if(poss==lens+1&&post==lent+1){
  23. return true;
  24. }
  25. else if(poss==lens+1||post==lent+1)
  26. return false;
  27. if(s[poss]=='*'){
  28. for(int i=post;i<=lent+1;i++)
  29. if(dfs(poss+1,i))
  30. return true;
  31. return false;
  32. }
  33. else if(s[poss]=='?'){
  34. return dfs(poss+1,post+1);
  35. }
  36. else{
  37. int tx=lower_bound(xing+1,xing+cntx+1,poss)-(xing),tw=lower_bound(wen+1,wen+cntw+1,poss)-(wen);
  38. // printf("tx=%d tw=%d\n",tx,tw);
  39. // printf("compare 1(%d,%d) 2(%d,%d) :\n",poss,min(xing[tx],wen[tw])-1,post,post+min(xing[tx],wen[tw])-poss-1);
  40. if(hash1(poss,min(xing[tx],wen[tw])-1)==hash2(post,post+(min(xing[tx],wen[tw])-poss-1))){
  41. // printf("true\n");
  42. return dfs(min(xing[tx],wen[tw]),post+(min(xing[tx],wen[tw])-poss));
  43. }
  44. else
  45. {
  46. // printf("false\n");
  47. return false;
  48. }
  49. }
  50. }
  51. int main(){
  52. init();
  53. scanf("%s",s+1);
  54. lens=strlen(s+1);
  55. for(int i=1;i<=lens;i++){
  56. if(s[i]!='*'||s[i]!='?')
  57. hashs1[i]=hashs1[i-1]*base+s[i];
  58. if(s[i]=='*')
  59. xing[++cntx]=i;
  60. if(s[i]=='?')
  61. wen[++cntw]=i;
  62. }
  63. xing[++cntx]=lens+1;
  64. wen[++cntw]=lens+1;
  65. scanf("%d",&n);
  66. for(int i=1;i<=n;i++){
  67. scanf("%s",t+1);
  68. lent=strlen(t+1);
  69. memset(hashs2,0,sizeof(hashs2));
  70. for(int j=1;j<=lent;j++){
  71. hashs2[j]=hashs2[j-1]*base+t[j];
  72. }
  73. printf("%s\n",dfs(1,1)?"YES":"NO");
  74. }
  75. return 0;
  76. }

P3167 [CQOI2014]通配符匹配的更多相关文章

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

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

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

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

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

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

  4. BZOJ3507 [Cqoi2014]通配符匹配

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

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

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

  6. [CQOI2014]通配符匹配

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

  7. 【bzoj3570】 Cqoi2014—通配符匹配

    http://www.lydsy.com/JudgeOnline/problem.php?id=3507 (题目链接) 题意 给出一个主串,里面有些通配符,'*'可以代替任意字符串或者消失,'?'可以 ...

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

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

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

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

随机推荐

  1. KVM_webvirtmgr

    一.webvirtmgr安装前说明: 1:操作做系统:centos7.2_x86_64 2:安装参考出处1:https://github.com/retspen/webvirtmgr/wiki/Ins ...

  2. 20165305 学习基础和C语言基础调查

    学习基础和C语言基础调查 <优秀的教学方法---做教练与做中学>心得 在<优秀的教学方法---做教练与做中学>文章中又一次提到了"做教练"这一学习方法,因为 ...

  3. 匿名内部类和内部类中的this

    package test; public class A extends B { public String toString() { return "A"; } public s ...

  4. AtCoder Beginner Contest 066 B - ss

    题目链接:http://abc066.contest.atcoder.jp/tasks/abc066_b Time limit : 2sec / Memory limit : 256MB Score ...

  5. Python之pytest 基础

    pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:1.简单灵活,容易上手:2.支持参数化:3.能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appn ...

  6. LINUX搭建PySpider爬虫服务

    1.环境搭建 yum update -y yum install gcc gcc-c++ -y yum install python-pip python-devel python-distribut ...

  7. Eclipse Luna在线安装Maven时报错:Java heap space

    问题描述: 在线安装Maven插件时发生了:Java heap space 问题截图:

  8. Eloquent JavaScript #01# values

    When action grows unprofitable, gather information; when information grows unprofitable, sleep.      ...

  9. Python3 join函数和os.path.join用法

    Python3  join函数和os.path.join用法 os.path.join()连接两个文件名地址的时候,就比os.path.join("D:\","test. ...

  10. PHP获取Linux当前目录下文件并实现下载功能

    使用nginx转发过去给php server{ listen 9099; server_name 18.5.6.2; location / { proxy_http_version 1.1; root ...