#include<cstdio>
#include<cstring>
#include<malloc.h>
typedef long long ll;
typedef struct node;
char str[12];
struct node{
int s;
node*nxt[26];
}*root;
ll ans=0;//root
inline node* build(){
node*a=(node*)malloc(sizeof(node));
a->s=1;
for(int i=0;i<26;i++)a->nxt[i]=NULL;
return a;
}
inline void ins(char*a){
node*n;
n=root;
int len=strlen(a);
for(int i=0;i<len;i++)
if(n->nxt[str[i]-'a']==NULL)n->nxt[str[i]-'a']=build(),n=n->nxt[str[i]-'a'];
else n=n->nxt[str[i]-'a'],(n->s)++;
}
inline int getans(char*a){
node*n=root;
int len=strlen(a);
for(int i=0;i<len;i++)
if(n->nxt[str[i]-'a']==NULL)return 0;
else n=n->nxt[str[i]-'a'];
return n->s;
}
int main(){
root=build();
int a;
scanf("%d",&a);
while(a--)scanf("%s",str),ins(str);
scanf("%d",&a);
while(a--)scanf("%s",str),printf("%d\n",getans(str));
return 0;
}
AC自动机(CJOJ1435)
#include<cstdio>
#include<cstring>
#include<malloc.h>
#include<queue>
#include<vector>
typedef long long ll;
typedef struct node;
char str[10001][52];
int ans[10001];
char Z[10000001];
std::queue<node*>F;
struct node {
std::vector<int>num;
node*nxt[26];
node*fail;
}*root;
inline node* build() {
node*a=new node;
for(int i=0; i<26; i++)a->nxt[i]=NULL;
return a;
}
inline void ins(char*a,int k) {
node*n;
n=root;
int len=strlen(a);
for(int i=0; i<len; i++)
if(n->nxt[str[k][i]-'a']==NULL)n->nxt[str[k][i]-'a']=build(),n=n->nxt[str[k][i]-'a'];
else n=n->nxt[str[k][i]-'a'];
n->num.push_back(k);
}
inline void del(node*n){
for(int i=0;i<26;i++)if(n->nxt[i]!=NULL)del(n->nxt[i]);
delete n;
}
int main() {
root=build();
int a;
scanf("%d",&a);
for(int i=1; i<=a; i++)scanf("%s",str[i]),ins(str[i],i);
F.push(root);
root->fail=root;
{
node*l;
do {
node*now=F.front();
for(int i=0; i<26; i++)
if(now->nxt[i]!=NULL) {
l=now->fail;
while(l!=root&&l->nxt[i]==NULL)l=l->fail;
if(l->nxt[i]!=NULL&&l->nxt[i]!=now->nxt[i])l=l->nxt[i];
now->nxt[i]->fail=l;
F.push(now->nxt[i]);
}
F.pop();
} while(!F.empty());
}
scanf("%s",Z+1);
int lenZ=strlen(Z+1);
node*P=root;
for(int i=1; i<=lenZ; i++) {
while(P!=root&&P->nxt[Z[i]-'a']==NULL)P=P->fail;
P=P->nxt[Z[i]-'a'];
if(P==NULL)P=root;
node*tmp=P;
while(tmp!=root) {
for(int i=0; i<(tmp->num.size()); i++)ans[tmp->num[i]]++;
tmp=tmp->fail;
}
}
for(int i=1; i<=a; i++)printf("%s %d\n",str[i],ans[i]);
del(root);
return 0;
}