这个题还是有点实际意义的。然后就是和那个帽子的题相似,因为其中有一点掉了,所以特此标记。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define maxn 26
typedef struct Trie
{
int v;
int h;
Trie *next[maxn];
};
char s[10005][25];
Trie *root;
void create(char *str,int h)
{
int len=strlen(str);
Trie *p=root,*q;
for(int i=0;i<len;i++)
{
int id=str[i]-'a';
if(p->next[id]==NULL)
{
q=new Trie;
q->v=1;
q->h=h;
for(int j=0;j<maxn;j++)
q->next[j]=NULL;
p->next[id]=q;
p=p->next[id];
}
else
{
p=p->next[id];
if(p->h!=h)
{
p->v++;
p->h=h;//这里容易掉
}
}
}
}
int findT(char *str)
{
int len = strlen(str);
Trie *p=root;
for(int i=0;i<len;i++)
{
int id= str[i]-'a';
if(p->next[id]==NULL)
return 0;
p=p->next[id];
}
return p->v;
}
void Rlease(Trie *p)
{
if(NULL==p)
return ;
for(int i=0;i<maxn;i++)
if(p->next[i]!=NULL)
Rlease(p->next[i]);
free(p);
root=NULL;
return;
}
int main()
{
int n;
root=new Trie;
root->v=0;
root->h=-1;
for(int i=0;i<maxn;i++)
root->next[i]=NULL;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s[i]);
}
char a[25];
for(int j=0;j<n;j++)
{
int len=strlen(s[j]);
for(int k=0;k<len;k++)
{
memset(a,0,sizeof(a));
strncpy(a,s[j]+k,len-k);//是倒序的
create(a,j);
}
}
int q;
scanf("%d",&q);
char b[25];
while(q--)
{
scanf("%s",b);
printf("%d\n",findT(b));
}
Rlease(root);
return 0;
}