• 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());
        }
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    How can i install ctags in centos 6.4
    [转载] Ubuntu Vim powerline 插件
    Vim 相关网页
    [转载] vim技巧:设置空格和Tab字符可见
    Don't trust cplusplus.com, it's crap. If any, go to cppreference.com.
    Vim yank only 50 lines
    按进程名终止进程
    Shell 脚本 Tips
    Bash 脚本 逐行处理文本文件的内容
    生成并配置https本地证书
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9261070.html
Copyright © 2020-2023  润新知