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());
        }
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    U**ty a*d Cooperat*o* Are the I*ter*at*o*al Commu**ty's Most *ote*t Weapo* to Overcome the *a*dem*c *art1
    Easy win for Barca as Messi pays homage to Maradona and Lenglet suffers ankle injury
    Ch**a's ma**ed submers*ble Fe*douzhe retur*s after ocea* exped*t*o*
    Documentarian Michael Wood: Chinese people key to reform 2020-11-28
    Timeline of Argentine football legend Maradona's life 2020-11-27
    Chang'e 5 sets out to collect moon samples in landmark mission 2020-11-25
    US companies looking at China for growth, says CNBC 2020-11-24
    [SJ-20-JCR2]-COMPLETE COVERAGE
    Latex应用语法记录
    排序算法学习
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9261070.html
Copyright © 2011-2022 走看看