zoukankan      html  css  js  c++  java
  • trie 树 模板

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #define maxn 2000010
    using namespace std;
    int tot, n, m, rt;
    int trie[maxn][26], sum[400001];
    char s[22];
    //bool vis[maxn];查询整个单词用
    void build()
    {
        int len = strlen(s);
        rt = 0;
        for(int i=0; i<len; i++)
        {
            int x=s[i]-'a';
            if(trie[rt][x]==0)//现在插入的字母在之前同一节点处未出现过
            {
                trie[rt][x]=++tot;//字母插入一个新的位置,否则不做处理
            }
            //sum[trie[rt][x]]++;    前缀后移一个位置保存前缀出现的次数
            rt=trie[rt][x];//为下个字母的插入做准备
        }
        /*vis[rt]=true;标志该单词末位字母的尾结点,在查询整个单词时用到*/
    }
    bool qp()
    {
        int len = strlen(s);
        rt = 0;
        for(int i=0; i<len; i++)
        {
            int x=s[i]-'a';
            if(trie[rt][x]==0)return false;//以rt为头结点的x字母不存在,返回0
            rt=trie[rt][x];//为查询下个字母做准备
        }
        return true;
        //查询整个单词时,应该return vis[rt] , 查询前缀出现的次数时,应该return sum[rt]
    }
    int main()
    {
        tot=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            cin>>s;
            build();
        }
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            cin>>s;
            if(qp()) printf("YES
    ");
            else printf("NO
    ");
        }
        scanf("%d",&m);
        for(int i=1; i<=m; i++)
        {
            cin>> s;
            printf("%d",qp());
    
        }
    
    
        return 0;
    }
        int idx(char s){
            if(s >= '0' && s <= '9'){
                return s - '0';
            }
     
            else if(s >= 'A' && s <= 'Z'){
                return 10 + s - 'A';
            }
     
            else{
                return 36 + s - 'a';
            }
     
        }
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    char s[11];
    int n,m;
    bool p;
    struct node
    {
        int count;
        node * next[26];
    }*root;
    node * build()
    {
        node * k=new(node);
        k->count=0;
        memset(k->next,0,sizeof(k->next));
        return k;
    }
    void insert()
    {
        node * r=root;
        char * word=s;
         while(*word)
        {
            int id=*word-'a';
            if(r->next[id]==NULL) r->next[id]=build();
            r=r->next[id];
            r->count++;
            word++;
        }
    }
    int search()
    {
        node * r=root;
        char * word=s;
        while(*word)
        {
            int id=*word-'a';
            r=r->next[id];
            if(r==NULL) return 0;
            word++;
        }
        return r->count;
    }
    int main()
    {
        root=build();
        scanf("%d",&n);
        for(int i=1;i<=n;i++) 
        {
                cin>>s;
                insert();
        }
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            cin>>s;
            printf("%d
    ",search());
        }
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    Iframe和Frame中实现cookie跨域的方法(转载)
    android中拷贝assets下的资源文件到SD卡中(可以超过1M)
    OpenSL ES 查询设备支持的SL Profiles
    NDK开发中的一个HTTP下载实例附带下载进度
    android中配置文件property的用途以及使用<转>
    Eclipse 工程使用相对路径导入Jar包设置
    Android 解压zip文件(支持中文)
    c++实现一个比较两个string类型的版本号的小demo
    linux c++下载http文件并显示进度<转>
    Linux下类似windows下_beginthread和_endthread 的多线程开发
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9261070.html
Copyright © 2011-2022 走看看