//字典树
//定义:注意任意字符需要130,01字典树只需要2
struct Node{int last; int sum; int son[26];}trie[1000000];
//插入:last参数标记在插入子串的末尾,sum记录插入时经过该节点次数
void insert(char *s){
for(int l=strlen(s),x=0,i=0;i<l;i++){
if(!trie[x].son[s[i]-'a'])trie[x].son[s[i]-'a']=++cnt;
x=trie[x].son[s[i]-'a'];
if(trie[x].last)flag=1;
if(i==l-1){
trie[x].last++;
if(trie[x].sum)flag=1;
}trie[x].sum++;
}
}
//查找:返回多少串以该串为前缀,可以利用last参数返回该串的前缀数目
int find(char *s){
for(int l=strlen(s),x=0,i=0;i<l;i++){
if(!trie[x].son[s[i]-'a'])return 0;
x=trie[x].son[s[i]-'a'];
if(i==l-1)return trie[x].sum;
}
}
//初始化
void del(int x){
for(int i=0;i<26;i++)
if(trie[x].son[i]){
del(trie[x].son[i]);
trie[x].son[i]=0;
}trie[x].sum=trie[x].last=0;
}