//字典树 //定义:注意任意字符需要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; }