[CQOI2014]通配符匹配 题解
第一眼:什么鬼东西ヾ(。`Д´。)
第二眼:显然,这道题要分段处理 类似[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]通配符匹配 题解的更多相关文章
- P3167 [CQOI2014]通配符匹配 题解
题目 题目大意 给出一个字符串,其中包含两种通配符 ‘?’和 ‘*’ ,‘?’可以代替一个字符,‘*’可以代替一个字符串(长度可以为0) 然后给出几个字符转,判断能否用给出的字符串表示出来 样例解释 ...
- 「题解报告」 P3167 [CQOI2014]通配符匹配
「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...
- BZOJ3507 [Cqoi2014]通配符匹配
题意 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号("*"),可以匹配0个及以上的任意字符:另一个是问号(" ...
- BZOJ3507 [Cqoi2014]通配符匹配 【哈希 + 贪心】
题目 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个 是星号(""'),可以匹配0个及以上的任意字符:另一个是问号(&quo ...
- [CQOI2014]通配符匹配
Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(""'),可以匹配0个及以上的任意字符:另一个 ...
- bzoj 3507: [Cqoi2014]通配符匹配
Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(“”’),可以匹配0个及以上的任意字符:另一个是问号(“?”),可 ...
- 【bzoj3570】 Cqoi2014—通配符匹配
http://www.lydsy.com/JudgeOnline/problem.php?id=3507 (题目链接) 题意 给出一个主串,里面有些通配符,'*'可以代替任意字符串或者消失,'?'可以 ...
- [BZOJ3507][CQOI2014]通配符匹配(DP+Hash)
显然f[i][j]表示S匹配到第i个通配符,T匹配到第j个字符,是否可行. 一次一起转移两个通配符之间的所有字符,Hash判断. 稍微有点细节.常数极大卡时过排名倒数,可能是没自然溢出的原因. #in ...
- [bzoj3507 Cqoi2014]通配符匹配 (hash+DP)
传送门 Solution 显然用哈希233 设\(f[i][j]\)表示第i个通配符和当前第j个字符是否匹配 考虑两种通配符的特性,直接转移即可 Code #include <cstdio> ...
- P3167 [CQOI2014]通配符匹配
吐槽 本来是去写AC自动机的,然后发现数据范围每个串100000,有100个串(???),连塞进trie树里都塞不进去,玩个鬼的AC自动机啊,tag不要乱打啊 最后拿字符串hash+爆搜一发搜过去了. ...
随机推荐
- html的table多级表头表格的代码
1,两级表头的代码 <html> <head> <title>多层表头</title> <link rel="stylesheet&qu ...
- CMMI审核期间的主要流程
整个阶段大致2个月左右,正式评估大概一个星期 一 计划准备阶段,包括我们一些资料的准备,做评估计划等 二 执行评估阶段 启动会议 主要主任评估师讲,所有人员参会 会议内容:主任评估师自我介绍 ,项目信 ...
- Rocky linux command-1
在Linux下一切皆文件 everything is file,包括目录也是文件的一种而这些文件被分为七种类型: • -:普通文件 • d: 目录文件 • b: 块设备 • c: 字符设备 • l: ...
- 【STM32】串口收发驱动Drv_Uart|学习笔记
一.什么事串口? 大家常说串口,其实串口有很多种UART,SPI,IIC都是串口,一般大家口中的串口就是UART(Universal Asynchronous Receiver/Transmitter ...
- 如何把高德地图搜索商家电话资料导出成excel里?
有很多人问我地图商家结果采集怎么做? 怎么样能够快速的把高德地图左边的搜索列表里的商家地图,电话,导出到EXCEL里. 如何快速地将高德地图里的商家电话资料导出EXCEL? 操作步骤: 1. 选择你要 ...
- redis获取图形验证码
1.在pom文件中先导入生成图像的依赖包 <dependency> <groupId>com.baomidou</groupId> <artifactId&g ...
- No.1.7
网页制作流程 创建根目录(网站的第一级文件夹) 1.图片文件夹:images 2.样式文件夹:CSS 3.首页:index.html <!-- 网站的首页 所有网站的首页都叫index.html ...
- 维纳攻击 wiener attack
维纳攻击 wiener attack 目录 维纳攻击 wiener attack 攻击条件 使用原理 十三届全国大学生网络安全竞赛 bd 分析 解答 [羊城杯 2020]rrrrrsa (wiener ...
- JS日期格式化方法 封装
//--------------------------------------------------- // 日期格式化 // 格式 YYYY/yyyy/YY/yy 表示年份 // MM/M 月份 ...
- mysql8.0修改密码
把密码设置为空:UPDATE mysql.user SET authentication_string='' WHERE user='root' and host='localhost'; 查看USE ...