meifan666 @ 2024-09-26 21:57:04
#include <bits/stdc++.h>
#define int long long
using namespace std;
int T,n,q;
string s;
int cnt,ans;
int son[3000100][70];
int many[3000100];
void insert(string a){
int p=0,len=a.size();
for(int i=0;i<len;i++){
if(!son[p][a[i]-'0'])son[p][a[i]-'0']=++cnt;
p=son[p][a[i]-'0'];
many[p]++;
}
}
int find(string a){
int p=0,len=a.size();
for(int i=0;i<len;i++){
if(!son[p][a[i]-'0'])return 0;
p=son[p][a[i]-'0'];
}
return many[p];
}
signed main() {
cin>>T;
while(T--){
cin>>n>>q;
for(int i=0;i<=cnt;i++){
many[i]=0;
for(int j=0;j<70;j++)son[i][j]=0;
}
cnt=0;
while(n--){
cin>>s;
insert(s);
}
while(q--){
cin>>s;
cout<<find(s)<<'\n';
}
}
return 0;
}
by HEROBRINEH @ 2024-09-26 21:58:46
AC求关
#include<bits/stdc++.h>
using namespace std;
#define int long long
int T;
int n,q,cnt;
int v[3000005],tr[3000005][70];
int turn(char c){
int b;
if(c>='a'&&c<='z')b=c-'a';
else if(c>='A'&&c<='Z')b=c-'A'+26;
else b=c-'0'+52;
return b;
}
signed main(){
cin>>T;
while(T--){
for(int i=0;i<=cnt;i++){
v[i]=0;
for(int j=0;j<=125;j++){
tr[i][j]=0;
}
}
cnt=0;
cin>>n>>q;
for(int i=1;i<=n;i++){
string s;
cin>>s;
int root=0;
for(int j=0;j<s.size();j++){
int c=turn(s[j]);
if(tr[root][c]==0){
cnt++;
tr[root][c]=cnt;
root=cnt;
}
else{
root=tr[root][c];
}
v[root]++;
}
}
while(q--){
string s;
cin>>s;
int root=0;
bool z=0;
for(int j=0;j<s.size();j++){
int c=turn(s[j]);
if(tr[root][c]==0){
z=1;
break;
}
root=tr[root][c];
}
if(z==0)cout<<v[root]<<endl;
else cout<<0<<endl;
}
}
return 0;
}
by meifan666 @ 2024-09-26 22:00:41
@HEROBRINEH 可以再源代码改吗,我想看看哪不对
by meifan666 @ 2024-09-27 21:55:34
@meifan666 字符映射后AC,此帖结