zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    【git hub使用】
    【struct2 第一天】
    【JSP基础 第一天】
    【Java基础学习 day01】
    网站建设 【Django】 【MTV】
    Python-Json字符串和XML解析
    Python-冒泡和快排
    Python-面向对象编程
    练习-字符串编码
    练习-统计文件中单词数量
  • 原文地址:https://www.cnblogs.com/ChrisKKK/p/11728289.html
Copyright © 2011-2022 走看看