Luogu_P2536 [AHOI2005]病毒检测
### trie树+dfs
题目链接
这两个符号比较有意思
可以把所有的串都先建到trie树上
然后用病毒的模式串在上面搜索
处理这两个符号就可以通过搜索次序解决
主要可以看代码
问的是非病毒,WA了
一个符号可以不取,又WA了
代码如下:
#include<bits/stdc++.h>
using namespace std;
string bd,w[1010];
int ans,n,trie[250010][10],tot=1,ed[250010],ls;
inline int id(char a){
if(a=='A') return 1;
if(a=='G') return 2;
if(a=='C') return 3;
if(a=='T') return 4;
}
inline void insert(string s){
int p=1,len=s.length();
for(int k=0;k<len;k++){
int ch=id(s[k]);
if(!trie[p][ch]) trie[p][ch]=++tot;
p=trie[p][ch];
}
ed[p]++;
}
bitset<1100> f[250010];
void dfs(int p,int t){
if(t==ls){
ans+=ed[p];ed[p]=0;return;
}
if(f[p][t]) return;f[p][t]=1;
if(bd[t]>='A' && bd[t]<='Z'){
int ch=id(bd[t]);
if(!trie[p][ch]) return;
p=trie[p][ch];
dfs(p,t+1);
}else{
if(bd[t]=='?'){
for(int i=1;i<=4;i++) if(trie[p][i]) dfs(trie[p][i],t+1);
}else{
dfs(p,t+1);
for(int i=1;i<=4;i++) if(trie[p][i]){
dfs(trie[p][i],t+1);dfs(trie[p][i],t);
}
}
}
}
int main()
{
cin>>bd>>n;
ls=bd.length();
for(int i=1;i<=n;i++) cin>>w[i],insert(w[i]);
dfs(1,0);
printf("%d\n",n-ans);
return 0;
}
原文地址:https://www.cnblogs.com/ChrisKKK/p/11728289.html
时间: 2024-11-04 22:14:39