struct Trie
{
int ch[maxnode][sigma_size];
int sz;
int cont[maxnode];
Trie() {memset(ch,0,sizeof ch);memset(cont,0,sizeof cont);sz=1;}
int idx(char c) {return c-'a';}
void insert(char *s)
{
int u=0,l=strlen(s);
for(int i=0;i<l;++i){
int c=idx(s[i]);
if(!ch[u][c]){
ch[u][c]=sz++;
}
u=ch[u][c];
cont[u]++; //字符串的最后一个节点记录信息
}
}
int query(char *s)
{
int u=0,l=strlen(s);
for(int i=0;i<l;++i){
int c=idx(s[i]);
if(!ch[u][c]) return 0;
u=ch[u][c];
}
return cont[u];
}
}T;
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define maxnode 10000
#define sigma_size 26
using namespace std;
struct tree
{
int num;
struct tree* next[sigma_size];
};
struct tree *root;
void insert(char *s)
{
struct tree *p=root,*q;
int l=strlen(s);
for(int i=0;i<l;++i){
int c=s[i]-'a';
if(p->next[c]==NULL){
q=(struct tree* )malloc(sizeof(struct tree));
q->num=1;
for(int j=0;j<sigma_size;++j){
q->next[j]=NULL;
}
p->next[c]=q;
p=p->next[c];
}
else{
p=p->next[c];
p->num++;
}
}
}
int query(char *s)
{
struct tree *p=root;
int l=strlen(s);
for(int i=0 ;i<l;++i){
int c=s[i]-'a';
p=p->next[c];
if(p==NULL) return 0;
}
return p->num;
}
void deal(struct tree * p)
{
if(p==NULL) return;
for(int i=0;i<sigma_size;++i){
if(p->next[i]!=NULL){
deal(p->next[i]);
}
}
free(p);
return ;
}
root=(struct tree* )malloc(sizeof(struct tree));
for(int i=0;i<sigma_size;++i){
root->next[i]=NULL;
}
root->num=0;