前缀统计
1010A 前缀统计
给定 N 个字符串 S1,S2…SN,接下来进行 M 次询问,每次询问给定一个字符串 T,求 S1−SN中有多少个字符串是 T 的前缀。输入字符串的总长度不超过 106,仅包含小写字母。
Trie模板题,把插入的时候的结尾bool数组改成计数器
int n,m;
int trie[maxn][30],tot=1;
int en[maxn];
char sn[maxn];
void inser(char *s){
//trie插入
int ch,len=strlen(s),p=1;
for(int i=0;i<len;i++){
ch=s[i]-'a';
if(trie[p][ch]==0)trie[p][ch]=++tot;
p=trie[p][ch];
}
en[p]++;
}
int sear(char *s){
//检索字符串是否存在
int len=strlen(s),p=1,ch,sum=0;
for(int i=0;i<len;i++){
ch=s[i]-'a';
p=trie[p][s[i]-'a'];
if(p==0)break;
sum+=en[p];
}
return sum;
}
int main(){
sci(n);sci(m);
LL ans=0;
rep(i,1,n){
scanf("%s",sn);
inser(sn);
}
rep(i,1,m){
scanf("%s",sn);
cout<<sear(sn)<<endl;
}
return 0;
}