码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-10-23 20:17:42      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:set   搜索   include   ret   ace   std   i++   har   pac   

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;
}

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

标签:set   搜索   include   ret   ace   std   i++   har   pac   

原文地址:https://www.cnblogs.com/ChrisKKK/p/11728289.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!