【模板】字典树

来源:互联网 发布:apache ant jar包 编辑:程序博客网 时间:2024/06/06 11:48
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cctype>#define to(c) c - 'a'using namespace std;const int MAXN = 24000;const int Alpha = 26;const int C = 50;int map[MAXN * C + 10][Alpha];int sz;bool flag[MAXN * C + 10];int root;bool find(char *c,int l)//查询--单词  单词长度 {    int now = 0;    for(int i = 0;i < l;i ++)    {        if(!map[now][to(c[i])])            return false;//不匹配         now = map[now][to(c[i])];    }    return flag[now];//当且仅当返回true时该单词存在//flag结束标记  这里匹配的可能只是某个单词前缀实际上该单词不存在 所以不能return true要看标记 }void find(char *c,int l)//删除  {    int now = 0;    for(int i = 0; i < l; i ++)    {        if(!map[now][to(c[i])])            return;        now = map[now][to(c[i])];    }    flag[now] = false;//找到最后的结束标记并删除即可      return;    //找不到的话也就不能用了 }void insert(char *c,int l){    int now = root;    for(int i = 0;i < l;i ++)    {        if(!map[now][to(c[i])])            map[now][to(c[i])] = ++sz;//sz == size 给新节点定编号         now = map[now][to(c[i])];//now当前节点(编号)      }    flag[now] = true;    return;}int ans;void dfs(int x,int tot){    if(!x)    {        ans = max(ans,tot);        return;    }    tot += flag[x];    for(int i = 0;i < 26;i ++)        dfs(map[x][i],tot);    tot -= flag[x];    return;}char s[MAXN];int n;int main(){    scanf("%d",&n);    for(int i = 1;i <= n;i ++)    {        scanf("%s",s);        insert(s,strlen(s));    }    for(int i = 0;i < 26;i ++)        dfs(map[0][i],flag[0]);    printf("%d\n",ans);    return 0;}
0 0
原创粉丝点击