题目
有几个字符串,现给出一些字符串SSS问SSS是否为字符串的前缀或字符串是SSS的前缀
分析
可以用end标记末尾,用sum表示有多少字符串经过该点
然后建trie就好了
代码
#include <cstdio>
int n,m,k,tot,trie[500001][2],end[500001],sum[500001];
int in(){
int ans=0; char c=getchar();
while (c<48||c>57) c=getchar();
while (c>47&&c<58) ans=ans*10+c-48,c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
int main(){
n=in(); m=in();
while (n--){
k=in(); int p=0,x;
for (register int i=1;i<=k;i++){
x=in();
if (!trie[p][x]) trie[p][x]=++tot;
p=trie[p][x]; sum[p]++;
}
end[p]++;
}
while (m--){
k=in(); int p=0,x,ans=0; bool flag=0;
for (register int i=1;i<=k;i++){
x=in(); p=trie[p][x];
if (!p) flag=1; if (!flag) ans+=end[p];
}
if(!flag) ans+=sum[p]-end[p];//未终止
if (ans) print(ans); else putchar('0');
putchar('\n');
}
return 0;
}