#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;
}
为什么