Luogu P2536 [AHOI2005]病毒检测
题意
给一个有通配符的模式串和 \(n\) 个文本串,其中 ?
可以匹配任意字符,*
可以匹配 \(0\) 或任意多个字符,求 \(n\) 个文本串中无法与模式串匹配的数量。
\(\texttt{Data Range:}1\leq n\leq 500\)
题解
非确定性有限状态决策自动机。
首先考虑对模式串建一个自动机。对于每一位我们可以抽象成一个节点,整个字符串可以抽象成一个转移图。在匹配的过程中,如果能够走到这个节点上来就说明能够与这个位置的前缀相匹配。这里需要讨论一下:
如果模式串的某一位为字母,那么将这一位的状态向下一位的状态连这个字母的边,也就是说只有这个字母能从这一位转移到下一位。
如果模式串的某一位为
?
,那么任何字母进来都能匹配上,也就是说将这一位的状态向下一位的状态连所有字母的边。如果模式串的某一位为
*
,这里是个小 trick,也就是说可以匹配任意长度的串,那就连个自环就可以了。
然后,对于匹配的话,从初始状态开始走,如果能够走到结束状态那么则匹配成功。
代码非常好写,跑得也很快。
代码
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=1e3+51;
struct Node{
ll isEnd;
vector<ll>nxt[4];
};
Node x[MAXN];
vector<ll>s,nxt;
ll n,len,tot,c,flg,res;
ll mp[128],vis[MAXN];
char ch[MAXN];
inline ll read()
{
register ll num=0,neg=1;
register char ch=getchar();
while(!isdigit(ch)&&ch!='-')
{
ch=getchar();
}
if(ch=='-')
{
neg=-1;
ch=getchar();
}
while(isdigit(ch))
{
num=(num<<3)+(num<<1)+(ch-'0');
ch=getchar();
}
return num*neg;
}
inline void match()
{
s.clear(),s.push_back(1);
for(register int i=1;i<=len;i++)
{
nxt.clear(),flg=0;
for(register int j=1;j<=tot;j++)
{
vis[j]=0;
}
for(register int j=0;j<s.size();j++)
{
for(register int k=0;k<x[s[j]].nxt[mp[ch[i]]].size();k++)
{
if((c=x[s[j]].nxt[mp[ch[i]]][k])&&!vis[c])
{
vis[c]=1,nxt.push_back(c),flg|=x[c].isEnd;
}
}
}
s=nxt;
}
res+=1-flg;
}
int main()
{
scanf("%s",ch+1),len=strlen(ch+1),tot=1,memset(mp,-1,sizeof(mp));
mp['A']=0,mp['G']=1,mp['C']=2,mp['T']=3;
for(register int i=1;i<=len;i++)
{
if(mp[ch[i]]!=-1)
{
x[tot].nxt[mp[ch[i]]].push_back(tot+1),tot++;
continue;
}
if(ch[i]=='?')
{
x[tot].nxt[0].push_back(tot+1),x[tot].nxt[1].push_back(tot+1);
x[tot].nxt[2].push_back(tot+1),x[tot].nxt[3].push_back(tot+1);
tot++;
continue;
}
if(ch[i]=='*')
{
x[tot].nxt[0].push_back(tot),x[tot].nxt[1].push_back(tot);
x[tot].nxt[2].push_back(tot),x[tot].nxt[3].push_back(tot);
continue;
}
}
x[tot].isEnd=1,n=read();
for(register int i=0;i<n;i++)
{
scanf("%s",ch+1),len=strlen(ch+1),match();
}
printf("%d\n",res);
}
Luogu P2536 [AHOI2005]病毒检测的更多相关文章
- P2536 [AHOI2005]病毒检测
反思 对于*符号,明明可以让相同位置再次匹配下一个,或者跳过当前位置匹配,但是却写了个把trie的子树全部push进队列的垃圾写法,结果一直MLE 告辞 思路 模板串多且不长,可以塞到trie树里,这 ...
- 【BZOJ1966】[AHOI2005]病毒检测(动态规划)
[BZOJ1966][AHOI2005]病毒检测(动态规划) 题面 BZOJ 洛谷 题解 我就蒯了一份代码随便改了改怎么就过了??? 从这道题目蒯的 代码: #include<iostream& ...
- [AHOI2005]病毒检测
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
- 【[AHOI2005]病毒检测】
\(Trie\) 树+搜索 我用的是\(dfs\) 首先对于将所有的RNA片段都建到\(Trie\)树里去,之后来匹配那个模板串就好了 如果是匹配的位置是字母,那么我们就继续往下匹配 如果是\(?\) ...
- bzoj1966:[AHOI2005]病毒检测
传送门 我也没想到map如此垃圾,bitset优秀啊 直接trie树上搜索就好了 代码: #include<cstdio> #include<iostream> #includ ...
- [luogu P2054] [AHOI2005]洗牌
[luogu P2054] [AHOI2005]洗牌 题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学 ...
- 基于深度学习的病毒检测技术无需沙箱环境,直接将样本文件转换为二维图片,进而应用改造后的卷积神经网络 Inception V4 进行训练和检测
话题 3: 基于深度学习的二进制恶意样本检测 分享主题:全球正在经历一场由科技驱动的数字化转型,传统技术已经不能适应病毒数量飞速增长的发展态势.而基于沙箱的检测方案无法满足 APT 攻击的检测需求,也 ...
- 【Luogu】P2536病毒检测(Trie上DP)
题目链接 这道题我写了个01DP,f[i][j]表示跑到Trie上第i个节点,匹配到字符串第j位行不行 然后重点在*号无限匹配怎么处理 经过一番脑洞我们可以发现*号无限匹配可以拆成两种情况: 1:匹配 ...
- bzoj1966: [Ahoi2005]VIRUS 病毒检测
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
随机推荐
- Spring属性注入(set方式、构造函数方式、p名称空间、spel、复杂类型)
1.set注入方式 (1)注入的为值类型(八大数据类型)的数据 配置文件: <?xml version="1.0" encoding="UTF-8"?&g ...
- springboot+mybatis集成分页功能
1.使用idea搭建srpingboot项目 在pom.xml文件中引入如下的依赖: <dependency> <groupId>org.springframework.boo ...
- C++逐字输出函数
void fun(string a) { for(int i=0;i<a.length();i++) { cout<<a[i]; usleep(10000); } cout<& ...
- C# Redis分布式锁(RedLock) - 多节点
Redis单节点的分布式锁只需要注意三点就可以了: 1.加锁并设置锁的过期时间必须是原子操作; 2.锁的value值必须要有唯一性; 3.释放锁的时候要验证其value值,不是自己加的锁不能释放. 但 ...
- pytest之将多个测试用例放在一个类中,生成唯一临时文件夹
将多个测试用例放在一个类中 简单来说就是将多个测试用例放到类中,通过pytest去管理,这和Testng很像.示例代码如下: """ 将多个测试用例放到一个类中执行 &q ...
- 头文件afx.h作用
转载:https://blog.csdn.net/OnceMonkeyG/article/details/95723290 一些定义与设置,为MFC提供最基本支持,将各种松散的东西组织起来,同时为MF ...
- Codeforces Global Round 11 A~D题解
A.Avoiding Zero 题目链接:https://codeforces.ml/contest/1427 题目大意:给定一个数组a1,a2...,an,要求找出一个a重排后的数组b1,b2,.. ...
- RHSA-2017:2907-重要: wpa_supplicant 安全更新
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
- (转载)跟Classic ARM 处理器说拜拜——Atmel SAMA5D3 Xplained开发板评测
2014 年 4 月 10 日 时间: 下午 3:15 作者: 幸得安然 电子产业的蓬勃发展带来了史无前例的生活.生产大跃进,但是,人们在享受发展喜悦的同时又不得不面临现实现状的囧境--在以移动电子设 ...
- macvlan几种模式
vepa模式:各个子设备直接无法直接通信(可以通过支持端口聚合的交换机通信),可以和外部通信. private模式:和vepa模式类似,各个子设备之间无法通信,即使通过支持端口聚合的交换机也不能. b ...