shoot_down @ 2023-08-24 20:28:56
#include<bits/stdc++.h>
using namespace std;
int cnt[70],tr[3000001][70],tot;
int cal(char x){
if(x>='A'&&x<='Z')
return x-'A';
else if(x>='a'&&x<='z')
return x-'a'+26;
else
return x-'0'+52;
// return a>='A'&&a<='Z'?a-'A':a>='a'&&a<='z'?a-'a'+26:a-'0'+52;
}
void build(string a){
int u=0,sa=a.size();
for(int i=0;i<sa;i++){
int x=cal(a[i]);
if(!tr[u][x]) tr[u][x]=++tot;
u=tr[u][x];
cnt[u]++;
}
}
int query(string a){
int u=0,sa=a.size();
for(int i=0;i<sa;i++){
int x=cal(a[i]);
if(!tr[u][x]) return 0;
u=tr[u][x];
}
return cnt[u];
}
int main(){
// freopen("P8306_1.in","r",stdin);
// freopen("ans.out","w",stdout);
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--){
for(int i=0;i<=tot;i++) for(int j=0;j<=65;j++) tr[i][j]=0;
for(int i=0;i<=tot;i++) cnt[i]=0;
tot=0;
int n,m;
cin>>n>>m;
string a;
for(int i=1;i<=n;i++) cin>>a,build(a);
for(int i=1;i<=m;i++) cin>>a,cout<<query(a)<<'\n';
}
return 0;
}
by Gambler_Super @ 2023-08-24 20:31:47
'Z'的ASCLL码〉70
by shoot_down @ 2023-08-24 20:34:21
@xue51huyuchuan 不是这个问题,应为z会在cal函数里重新计算。而是cnt数组开小了。
by shoot_down @ 2023-08-24 20:34:46
此贴结。
by TankYu @ 2023-08-24 20:35:16
@shoot_down cnt开这么小?
by shoot_down @ 2023-08-24 20:38:11
@TankYu 失误。
另外问一下为什么第一篇题解的初始化没有RE,t[i][j]的j不会溢出吗?
by TankYu @ 2023-08-24 20:44:49
@shoot_down 能越界越到一个数组就不会RE
这是我调错3小时的教训
by TankYu @ 2023-08-24 20:46:38
@shoot_down 事实上越界如果不访问野指针是不会RE的
而这个二维数组内存连续,于是它可能越界到了这个二维数组的某个地方,或者下一块内存cnt的某个地方,不会RE