zoukankan      html  css  js  c++  java
  • 「Luogu」P2580 于是他错误的点名开始了

    题意:原题在这

    给出整数n(n<=10000)表示人数。接下来 n 行,每行一个字符串表示人名(互不相同,且只含小写字母,长度不超过 50)。第 n+2 行一个整数 m,表示教练报的名字。接下来 m 行,每行一个字符串表示教练报的名字(只含小写字母,且长度不超过 50)。判断教练报的名字是否错误或重复

    做法:(详见行内注释)

    简单模板题


    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int n,m;
    int tot=0;//节点总数
    struct node
    {
        bool have;
        int cnt;
        int son[27];
        node()
        {
            cnt=0;
            memset(son,false,sizeof son);
            have=false;
        }
    }tree[800005];
    
    void insert(string c)//插入字符串s
    {
        int now=0;
        for(int i=0;i<c.size();i++)
        {
            int v=c[i]-'a';
            if(tree[now].son[v]==0)//结点不存在
            {
                tree[now].son[v]=++tot;//新建结点
            }
            now=tree[now].son[v];
            // tree[now].cnt++;//统计出现次数
        }
        tree[now].have=1;
    }
    
    int find(string c)
    {
        int now=0;
        for(int i=0;i<c.size();i++)
        {
            int v=c[i]-'a';
            if(!tree[now].son[v]) return 3;
            now=tree[now].son[v];
        }
        if(!tree[now].have) return 3;
        if(!tree[now].cnt)
        {
            tree[now].cnt++;
            return 1;
        }
        return 2;   
    }
    
    int main()
    {
        char name[100],point[100];
        scanf("%d",&n);
        for (int i=1;i<=n;++i)
        {
            cin>>name;
            insert(name);
        }
        scanf("%d",&m);
        for (int i=1;i<=m;++i)
        {
            cin>>point;
            int p=find(point);
            if (p==1) cout<<"OK"<<endl;
            else if(p==2) cout<<"REPEAT"<<endl;
            else if(p==3) cout<<"WRONG"<<endl;
        }
        return 0;
    }

    附一个普通Trie模板:

    //O(26*s.size());
    int tot=0;//节点总数
    string s;
    
    struct node
    {
        int cnt;
        // vector<int> son;//省空间
        int son[27];//省时间
        //STL map较为均衡 
    }tree[100005];
    
    void insert(string c)//插入字符串s
    {
        int now=1;
        for(int i=1;i<=c.size();i++)
        {
            int v=c[i]-'a';
            if(tree[now].son[v]==0)//结点不存在
            {
                tree[now].son[v]=++tot;//新建结点
            }
            now=tree[now].son[v];
            tree[now].cnt++;//统计出现次数
        }
    }
    
    bool find(string c)//c串存不存在
    {
        int now=1;
        for(int i=1;i<=c.size();i++)
        {
            int v=c[i]-'a';
            if(!tree[now].cnt) return true; 
            else return false;
        }
    }
  • 相关阅读:
    低代码:时代的选择
    AI+云原生,把卫星遥感虐的死去活来
    网络货运平台要智能,安全的数据底座少不了
    基于昇腾CANN的卡通图像生成可在线体验啦!十分钟带你了解CANN应用开发全流程
    什么是强化学习?
    高可用架构演进之单元化
    AOC萌新探索:搭建和体验在线AOC环境
    如何将知识引入机器学习模型提升泛化能力?
    零代码以“王者荣耀”为例解析设计七原则
    从零开始搭建前端脚手架
  • 原文地址:https://www.cnblogs.com/LocaEtric/p/9614150.html
Copyright © 2011-2022 走看看