zoukankan      html  css  js  c++  java
  • [洛谷 2580] 于是他错误的点名开始了

    XS中学化学竞赛组教练是一个酷爱炉石的人。

    他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900)。

    题目描述

    这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞赛学生的人数和名单,而你需要告诉校长他有没有点错名。(为什么不直接不让他玩炉石。)

    输入输出格式

    输入格式:
    第一行一个整数 n,表示班上人数。接下来 n 行,每行一个字符串表示其名字(互不相同,且只含小写字母,长度不超过 50)。第 n+2 行一个整数 m,表示教练报的名字。接下来 m 行,每行一个字符串表示教练报的名字(只含小写字母,且长度不超过 50)。

    输出格式:
    对于每个教练报的名字,输出一行。如果该名字正确且是第一次出现,输出“OK”,如果该名字错误,输出“WRONG”,如果该名字正确但不是第一次出现,输出“REPEAT”。(均不加引号)

    输入输出样例

    输入样例#1:
    5
    a
    b
    c
    ad
    acd
    3
    a
    a
    e
    输出样例#1:
    OK
    REPEAT
    WRONG
    说明

    对于 40%的数据,n≤1000,m≤2000;

    对于 70%的数据,n≤10000,m≤20000;

    对于 100%的数据, n≤10000,m≤100000。

    T1总是送分的。

    思路
    简单的字典树题,维护一棵字典树(ch)
    首先将录入的名单建成一棵字典树,在每个名字解释后标记(val)
    再将点名的名单带入进行查询,再用一个数组(k)记录次单词被点名过没有
    没有就输出OK,有就输出REPERT,(ps:我repeat拼错调了好久。。。)

    原文链接:https://blog.csdn.net/xljer_/article/details/72235905

    #include <iostream>
    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cctype>
    #include <cstdlib>
    using namespace std;
    char s[55];
    int ch[500001][30];
    int val[500001],k[500001];
    int sz=1;//序号
    void insert(char *s){//建树的函数
        int u=0;//u当前节点
        int len=strlen(s);
        for(int i=0;i<len;i++){
            int c=s[i]-'a';
            if(ch[u][c]>0){
                u=ch[u][c];
            }
            else
            {
                val[sz]=0;
                ch[u][c]=sz;
                u=sz;
                sz++;
            }
        }
        val[u]=1;//单词结尾标为1,标记他是个单词
    }
    int search(char *s){//
        int u=0;
        int len=strlen(s);
        int flag=2;
        int c;
        for(int i=0;i<len;i++)
        {
            c=s[i]-'a';
            if(!ch[u][c])//没有这个单词 返回 错误
                return 2;
            else u=ch[u][c];//有 就继续向下
        }
        //此时已到达搜索单词的最后一个字母
        if(!val[u]) return 2;//如果不是单词(是其他单词的前缀)返回 失败
        if(k[u]>0) return 1;//如果已经报过一遍了 返回 重复
        k[u]=1;//标记 此单词 已经报过
        return 0;//返回 正确
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            s[strlen(s)]='';
            insert(s);//建树
        }
        int m;
        scanf("%d",&m);
        for(int i=1;i<=m;i++){
            scanf("%s",s);
            s[strlen(s)]='';//搜索
            int ans=search(s);//三种情况 分别输出
            if(ans==0)  cout<<"OK"<<endl;
            else if(ans==1) cout<<"REPEAT"<<endl;
            else if(ans==2) cout<<"WRONG"<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    HTML5结构
    HTML5新增的非主体元素header元素、footer元素、hgroup元素、adress元素
    CF GYM 100703G Game of numbers
    CF GYM 100703I Endeavor for perfection
    CF GYM 100703K Word order
    CF GYM 100703L Many questions
    CF GYM 100703M It's complicate
    HDU 5313 Bipartite Graph
    CF 560e Gerald and Giant Chess
    POJ 2479 Maximum sum
  • 原文地址:https://www.cnblogs.com/cutemush/p/12560579.html
Copyright © 2011-2022 走看看