吐槽

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

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

思路

挺恶心的搜索吧

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

然后边界不要写挂就好了

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int base=131;
int xing[100100],wen[100100],n,lens,cntx,cntw,lent;
unsigned long long hashs1[100100],hashs2[100100],pow[100100];
char s[100100],t[100100];
void init(void){
pow[0]=1;
for(int i=1;i<=100001;i++)
pow[i]=pow[i-1]*base;
}
unsigned long long hash1(int l,int r){
return hashs1[r]-hashs1[l-1]*pow[r-l+1];
}
unsigned long long hash2(int l,int r){
return hashs2[r]-hashs2[l-1]*pow[r-l+1];
}
bool dfs(int poss,int post){
// printf("%d %d\n",poss,post);
if(poss==lens+1&&post==lent+1){
return true;
}
else if(poss==lens+1||post==lent+1)
return false;
if(s[poss]=='*'){
for(int i=post;i<=lent+1;i++)
if(dfs(poss+1,i))
return true;
return false;
}
else if(s[poss]=='?'){
return dfs(poss+1,post+1);
}
else{
int tx=lower_bound(xing+1,xing+cntx+1,poss)-(xing),tw=lower_bound(wen+1,wen+cntw+1,poss)-(wen);
// printf("tx=%d tw=%d\n",tx,tw);
// 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);
if(hash1(poss,min(xing[tx],wen[tw])-1)==hash2(post,post+(min(xing[tx],wen[tw])-poss-1))){
// printf("true\n");
return dfs(min(xing[tx],wen[tw]),post+(min(xing[tx],wen[tw])-poss));
}
else
{
// printf("false\n");
return false;
}
}
}
int main(){
init();
scanf("%s",s+1);
lens=strlen(s+1);
for(int i=1;i<=lens;i++){
if(s[i]!='*'||s[i]!='?')
hashs1[i]=hashs1[i-1]*base+s[i];
if(s[i]=='*')
xing[++cntx]=i;
if(s[i]=='?')
wen[++cntw]=i;
}
xing[++cntx]=lens+1;
wen[++cntw]=lens+1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",t+1);
lent=strlen(t+1);
memset(hashs2,0,sizeof(hashs2));
for(int j=1;j<=lent;j++){
hashs2[j]=hashs2[j-1]*base+t[j];
}
printf("%s\n",dfs(1,1)?"YES":"NO");
}
return 0;
}

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. sitecore系列教程之Sitecore个性化定制体验的内容策略

    这是利用Sitecore个性化引擎实现数字化转型的三部分系列文章的第一部分. 想象一下这种情况:您是一家B2C公司,拥有源源不断的客户群,支持您的直接面向消费者的产品.您最近推出了一项新服务,旨在为不 ...

  2. java 序列化和反序列化的实现原理

    老是听说序列化反序列化,就是不知道到底什么是序列化,什么是反序列化?今天就在网上搜索学习一下,这一搜不要紧,发现自己曾经用过,竟然不知道那就是JDK类库中序列化和反序列化的API. ----什么是序列 ...

  3. nodejs typescript怎么发送get、post请求,如何获取网易云通信token

    nodejs typescript怎么发送get.post请求,如何获取网易云通信token yarn add jshashesyarn add superagent检查语法yarn lint==== ...

  4. Django 应用 静态文件配置

    Django 应用 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  5. jquery遍历获取每一行数据进行对比

    $("#dtlTable tr:gt(0)").each(function(i){ var orderQtyBy = $("input[name='orderQtyBys ...

  6. MySQL笔记(七)远程连接MySQL

    mysql 默认只允许 localhost 连接,因此在远程连接服务器上的 mysql 之前,需要做一些设置.在没有设置前,默认是下面的状况,mysql 只能由 localhost(127.0.0.1 ...

  7. 开启redis-server提示 # Creating Server TCP listening socket *:6379: bind: Address already in use--解决方法

    在bin目录中开启Redis服务器,完整提示如下: 3496:C 25 Apr 00:56:48.717 # Warning: no config file specified, using the  ...

  8. php+js 防止被抓包篡改数据,数据签名校验

    签名密钥,这个是自己生成的,需要客户端+服务端一致. <?php /** * 获取签名 * @param $data 提交的数据 * @param $key 安全密钥 * @return boo ...

  9. ztree实现表格风格的树状结构

    zTree官方api: http://www.treejs.cn/v3/api.php 原理很简单:利用zTree的addDiyDom方法,自定义每个DOM节点,在原来的节点后面加一些div,再利用c ...

  10. VMware Workstation Pro14安装

    1. 下载VMware Workstation Pro14,注意,这个链接支持win7 64及以上系统 2.  点击进入安装 3. 接受许可协议 4. 选择安装目录,是否选择增强型键盘驱动程序 5. ...