Luogu_P2536 [AHOI2005]病毒检测 trie树+dfs

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-ans);
    return 0;
}
原文地址:https://www.cnblogs.com/ChrisKKK/p/11728289.html