제목 설명
링크 제목 :
N 문자열이 지정된 통계 접두사 S 1, S 2 ,, SN S_ {1}, S_ {2}, ..., S_ {N} ...에스(1),에스이,. . . ,에스N, 다음MM입니다M 개의 쿼리, 각 쿼리에TT문자열이 제공됩니다.T ,S 1 ∼ SN S_ {1} ∼S_ {N} 찾기에스(1)~에스N몇 개의 문자열이 TT에 있습니까?T 의 접두사 . 입력 문자열의 총 길이는10 6 10 ^ 6을초과하지 않습니다.1 06 , 소문자 만 포함합니다.
입력 설명 :
첫 번째 줄에두 개의 정수N, MN, MN , M . 다음NNN 라인에서 라인 당 하나의 스트링S i SiS i . 다음 M 줄에서 한 줄에 하나의 문자열이 쿼리를 나타냅니다.
출력 설명 :
. 각 쿼리 출력 응답을 나타내는 정수를 들면
실시 예 1
입력
3 2
순이
기원전
ABC
ABC
EFG
출력
2
0
C ++ 코드 :
#include<cstdio>
#include<cstring>
const int maxn=1e6+100;
int trie[maxn][30];
int Isword[maxn];
int id=0;
void Insert(char *s){
int len=strlen(s),p=0;
for(int i=0;i<len;i++){
if(!trie[p][s[i]-'a']) trie[p][s[i]-'a']=++id;
p=trie[p][s[i]-'a'];
}
Isword[p]++;
}
int IsPrefix(char *s){
int len=strlen(s),p=0,sum=0;
for(int i=0;i<len;i++){
if(!trie[p][s[i]-'a']) return sum;
p=trie[p][s[i]-'a'];
sum+=Isword[p];
}
return sum;
}
int main(){
int N,M;
scanf("%d%d",&N,&M);
char S[maxn];
while(N--){
scanf("%s",&S);
Insert(S);
}
int res=0;
char T[maxn];
while(M--){
scanf("%s",&T);
printf("%d\n",IsPrefix(T));
}
return 0;
}