60分代码求调
查看原帖
60分代码求调
750728
Gao_l楼主2024/7/11 14:56

trie树+DFS wa#7~#10

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+5;
string bd;
int n,tot,a[N],ans[N],e;
bool vis[1005][1005];
struct node{
    int nxt[7];
}tree[N];
int idx(char c){
    if(c=='A')return 1;
    if(c=='C')return 2;
    if(c=='T')return 3;
    if(c=='G')return 4;
    if(c=='?')return 5;
    if(c=='*')return 6;
}
void update(string s){
    int cur=0;
    for(int i=0;i<s.size();i++){
        int a=idx(s[i]);
        if(!tree[cur].nxt[a]){
            tree[cur].nxt[a]=++tot;
        }
        cur=tree[cur].nxt[a];
    }
    ans[cur]++;
    return ;
}
void dfs(int cnt,int cur){
    if(cnt==bd.size()){
        e+=ans[cur];
        ans[cur]=0;
        // cout << cur;
        return ;
    }
    if(vis[cnt][cur])return ;
    vis[cnt][cur]=1;
    int x=idx(bd[cnt]);
    if(x>=1&&x<=4){
        if(tree[cur].nxt[x]){
            dfs(cnt+1,tree[cur].nxt[x]);
        }
    }
    if(x==5){
        for(int i=1;i<=4;i++){
            if(tree[cur].nxt[i]){
                dfs(cnt+1,tree[cur].nxt[i]);
            }
        }
    }
    if(x==6){
        dfs(cnt+1,cur);
        for(int i=1;i<=4;i++){
            if(tree[cur].nxt[i]){
                dfs(cnt+1,tree[cur].nxt[i]);
                dfs(cnt,tree[cur].nxt[i]);
            }
        }
    }
}
signed main(){
    cin >> bd >> n;
    for(int i=1;i<=n;i++){
        string s;
        cin >> s;
        update(s);
    }
    dfs(0,0);
    cout << n-e;
    return 0;
}
2024/7/11 14:56
加载中...