求解
查看原帖
求解
1423724
dyxcj楼主2025/7/31 19:48
#include<bits/stdc++.h>
using namespace std;
const int L=6,N=500005,M=1005;
bitset<M>B[N];
string z,b;
int tot,n,len,sum;
struct Tree{
    int son[L],sum=0;
}t[N];
int Give(char w){
    if(w=='A')return 0;
    if(w=='G')return 1;
    if(w=='T')return 2;
    if(w=='C')return 3;
    if(w=='?')return 4;
    return 5;
}
void update(string z){
    int id,len=z.length(),u=0;
    for(int i=0;i<len;i++){
        id=Give(z[i]);
        if(t[u].son[id]==0)t[u].son[id]=++tot;
        u=t[u].son[id];
    }
    t[u].sum++;
}
void dfs(int x,int y){
    if(x==len){
        sum+=t[y].sum;
        t[y].sum=0;
        return;
    }
    if(B[y][x])return;
    int u=Give(b[x]);
    B[y][x]=1;
//    if(u>=0&&u<=3)if(t[y].son[u])dfs(x+1,t[y].son[u]);
//    if(u==4)for(int i=0;i<4;i++)dfs(x+1,t[y].son[i]);
//    if(u==5){
//        dfs(x+1,y);
//        for(int i=0;i<4;i++){
//            if(t[y].son[i]){
//                dfs(x+1,t[y].son[i]);
//                dfs(x,t[y].son[i]);
//            }
//        }
//    }
    if(u<=3){
        if(t[y].son[u])
        dfs(x + 1, t[y].son[u]);
    }
    if(u==4)for(int i=0;i<4;i++)if(t[y].son[i])dfs(x+1,t[y].son[i]);
    if(u==5){
        dfs(x+1,y);
        for(int i=0;i<4;i++)if(t[y].son[i])dfs(x+1,t[y].son[i]),dfs(x,t[y].son[i]);
    }
    return;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>b>>n;
    for(int i=1;i<=n;i++){
        cin>>z;
        update(z);
    }
    z=b;
    len=b.length();
    dfs(0,0);
    cout<<n-sum;
    return 0;
}

这份代码满分 但这份过不去样例

#include<bits/stdc++.h>
using namespace std;
const int L=6,N=500005,M=1005;
bitset<M>B[N];
string z,b;
int tot,n,len,sum;
struct Tree{
    int son[L],sum=0;
}t[N];
int Give(char w){
    if(w=='A')return 0;
    if(w=='G')return 1;
    if(w=='T')return 2;
    if(w=='C')return 3;
    if(w=='?')return 4;
    return 5;
}
void update(string z){
    int id,len=z.length(),u=0;
    for(int i=0;i<len;i++){
        id=Give(z[i]);
        if(t[u].son[id]==0)t[u].son[id]=++tot;
        u=t[u].son[id];
    }
    t[u].sum++;
}
void dfs(int x,int y){
    if(x==len){
        sum+=t[y].sum;
        t[y].sum=0;
        return;
    }
    if(B[y][x])return;
    int u=Give(b[x]);
    B[y][x]=1;
    if(u>=0&&u<=3)if(t[y].son[u])dfs(x+1,t[y].son[u]);
    if(u==4)for(int i=0;i<4;i++)dfs(x+1,t[y].son[i]);
    if(u==5){
        dfs(x+1,y);
        for(int i=0;i<4;i++){
            if(t[y].son[i]){
                dfs(x+1,t[y].son[i]);
                dfs(x,t[y].son[i]);
            }
        }
    }
    return;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>b>>n;
    for(int i=1;i<=n;i++){
        cin>>z;
        update(z);
    }
    z=b;
    len=b.length();
    dfs(0,0);
    cout<<n-sum;
    return 0;
}

为什么

2025/7/31 19:48
加载中...