第一眼:什么鬼东西ヾ(。`Д´。)


第二眼:显然,这道题要分段处理 类似[TJOI2018]碱基序列\ (建议做一做也是Hash+DP)\ 那你怎么第一眼没看出来


Hash处理+DP==AC


直接上代码 (码风奇特请谅解,注释还算详细)

#include<cstdio>
#include<cstring>
#define _for(i,a,b) for(register int i=(a);i<=(b);i=-~i)
#define __for(i,a,b) for(register int i=(a);i>=(b);i=~-i)
#define Re register int
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=2147483647,N=100000+20,M=11;
inline int re(){int x=0,f=0;
char ch=getchar();
while(ch>'9'||ch<'0')
f|=ch=='-',ch=getchar();
while(ch>='0'&&ch<='9')
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
} char s1[N],s2[N];
ull hash1[110],hash2[N],p[N];
int len[110],n,cnt,hl,len2,num;
bool f[110][N];//懒得压维(按顺序处理到第几组、对应字符串中的哪一位) int main()
{
scanf("%s",s1+1);//从1开始存,个人习惯
n=re();
len[0]=strlen(s1+1);
_for(i,1,len[0])//分段
if(s1[i]=='*')//处理*和?
hash1[++cnt]='*';
else if(s1[i]=='?')
hash1[++cnt]='?';
else
if(s1[i-1]<'a'||s1[i-1]>'z')//前面不是字母,记录长度
hash1[++cnt]=s1[i]-'a'+1,len[cnt]=1;
else//前面是字母
hash1[cnt]=hash1[cnt]*131+s1[i]-'a'+1,len[cnt]++;
hl=len[0];
p[0]=1;//Hash 131进制
_for(i,1,len[0])
p[i]=p[i-1]*131;
while(n--)
{
scanf("%s",s2+1);
len2=strlen(s2+1);
_for(i,1,len2)//正常Hash
hash2[i]=hash2[i-1]*131+s2[i]-'a'+1;
memset(f,0,sizeof(f));
if(len2>hl)//小小的卡常
{
_for(i,hl+1,len2)
p[i]=p[i-1]*131;
hl=len2;
}
f[0][0]=1;//初始化!!!只初始化(0,0)
_for(i,1,cnt)
{
if(!len[i])//不是字母
{
if(hash1[i]=='?')
{//?是下一个字母任意
_for(j,0,len2)//由上一行向下转移
if(f[i-1][j])
f[i][j+1]=1;
}
else
{//*是之后的字母全任意
_for(j,0,len2)
if(f[i-1][j])
{
_for(k,j,len2)
f[i][k]=1;
break;
}
if(f[i-1][0]) f[i][0]=1;
}
continue;
}
_for(j,len[i],len2)//正常字符串匹配
if(hash1[i]==hash2[j]-hash2[j-len[i]]*p[len[i]]&&f[i-1][j-len[i]])
//一定是要能转移过来的
f[i][j]=1;
}
if(f[cnt][len2])//要求是完全匹配,所以只看放完最后一组最后一位是否能放
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
/*
观察题目,通配符不超过10个
分段
Hash
跑DP
类似[TJOI2018]碱基序列
*/

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

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

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

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

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

  3. BZOJ3507 [Cqoi2014]通配符匹配

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

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

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

  5. [CQOI2014]通配符匹配

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

  6. bzoj 3507: [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> ...

  10. P3167 [CQOI2014]通配符匹配

    吐槽 本来是去写AC自动机的,然后发现数据范围每个串100000,有100个串(???),连塞进trie树里都塞不进去,玩个鬼的AC自动机啊,tag不要乱打啊 最后拿字符串hash+爆搜一发搜过去了. ...

随机推荐

  1. mysql报错:MySQL server has gone away

    一.报错提示: 二.报错原因: 原因一: 一种可能是发送的 SQL 语句太长,以致超过了 max_allowed_packet 的大小,如果是这种原因,你只要修改 my.cnf,加大 max_allo ...

  2. 【RUNOOB】C语言学习之指针

    资料来源: (1) runoob; (2) C语言程序设计; 注1:Runoob中对于指针的讲述比较清晰简单,摘录出来(后续补充指针与结构体,指针与函数参数); 1.指针与变量的内存位置 (1) 每个 ...

  3. Zookeeper ZAB协议

    这篇博客是从源码的角度了解Zookeeper 从接收客户端请求开始,到返回数据为止,有很多涉及到的对象创建因为在前几篇文章已经说明过了,这里就不再重复的说明了,如果不是很明白的的,可以先看前几篇博文了 ...

  4. mybatis-关联查询4-多对多查询

    三张表的关联查询  

  5. SpringBoot配置阿里云https提示端口占用问题

    1.因为要配置https,所以去网上找了一些资料,然后按照步骤,依次完成了以下步骤 ①在application.yml中加入配置 http: port: 12000 #原本的端口号server: po ...

  6. JMETHOD

    #include <iostream> #define JMETHOD(type,methodname,arglist) type (*methodname) arglist JMETHO ...

  7. mfcc vs fbank

    There is some debate in the community regarding the use of the DCT, instead of directly using the lo ...

  8. 虚拟机重置root用户密码

    虚拟机root用户重置密码 在打开虚拟机 在出现下图界面的时候按 e 进入管理界面 e要快速按 不然就会直接进入虚拟机 然后找到 UTF-8 在后面添加 rd.break 输入完后按 Ctrl+x 跳 ...

  9. PR / PO审批

    PR审批的BAPI 1.单个项目PR审批 CALL FUNCTION 'BAPI_REQUISITION_RELEASE' EXPORTING number = l_banfn rel_code = ...

  10. Android studio学习笔记1

    Android studio学习笔记1 20201303张奕博 2023.1.13 studio布局 1.线性布局 Android的线性布局不会换行,当组件一个挨着一个地排列到头之后,剩下的组件将不会 ...