Trie 树求找错
查看原帖
Trie 树求找错
180103
Ew_Cors楼主2022/10/15 17:05

RT,WA on #7~#10。

Code:

#include<bits/stdc++.h>
using namespace std;

string s,ss;
int n,m;

int h[150];

void init_h(){
    h['A']=0;
    h['G']=1;
    h['T']=2;
    h['C']=3;
}

int trie[250005][4],ep[250005];

void Insert(string x){
    static int cnt=1;
    int p=1;

    for(int i=0;i<x.size();i++){
        if(!trie[p][h[x[i]]]){
            cnt++;
            trie[p][h[x[i]]]=cnt;
        }

        p=trie[p][h[x[i]]];
    }

    ep[p]++;
}

int ans;

bitset<1005>vis[250005];

void dfs(int step,int p){
    if(vis[step][p])
        return;
    
    if(step==n){
        ans+=ep[p];

        ep[p]=0;
        return;
    }

    vis[step][p]=1;

    switch(s[step]){
        case 'A':
        case 'G':
        case 'T':
        case 'C':{
            if(trie[p][h[s[step]]])
                dfs(step+1,trie[p][h[s[step]]]);
            break;
        }
        case '?':{
            for(int i=0;i<4;i++)
                if(trie[p][i])
                    dfs(step+1,trie[p][i]);
            break;
        }
        case '*':{
            dfs(step+1,p);
            
            for(int i=0;i<4;i++)
                if(trie[p][i]){
                    dfs(step+1,trie[p][i]);
                    dfs(step,trie[p][i]);
                }
            break;
        }
    }
}

int main(){
    init_h();

    cin>>s>>m;
    n=s.size();
    
    for(int i=1;i<=m;i++){
        cin>>ss;
        Insert(ss);
    }
    
    dfs(0,1);

    cout<<m-ans;
    return 0;
}
2022/10/15 17:05
加载中...