字典树变形题!很好的题~学会了很多!
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct Trienode
{
int cnt;
int id;
Trienode* next[26];
};
void insert(Trienode *root,char *s,int id)
{
Trienode *p = root;
int i = 0;
while(s[i]!='\0')
{
//cout<<i<<endl;
int k = s[i]-'a';
if(p->next[k] == NULL)
{
Trienode *tmp = new Trienode;
for(int j = 0;j < 26;j ++)
tmp->next[j] = NULL;tmp->cnt = 0;
tmp->id = -1;
p->next[k] = tmp;
}
p = p -> next[k];
if(p->id!=id){
p->id = id;
p->cnt ++;
}
i ++;
}
}
int search(Trienode *root,char *s)
{
int i,k;
Trienode *p = root;
i = 0;
while(s[i]!='\0')
{
k = s[i] - 'a';
if(p->next[k] == NULL) return 0;
else p = p -> next[k];
i ++;
}
return p->cnt;
}
int main()
{
char s[20];
Trienode *root = new Trienode;
root ->cnt = 0;
for(int j = 0;j < 26;j ++)
root->next[j] = NULL;
int n,q,i;
while(scanf("%d",&n)!=EOF)
{
for(i = 0;i < n;i ++)
{
scanf("%s",&s);
for(int j = 0;j < strlen(s);j ++)
{
insert(root,s+j,i);
//cout<<s+j<<endl;
}
}
scanf("%d",&q);
while(q --)
{
scanf("%s",&s);
printf("%d\n",search(root,s));
}
}
return 0;
}