前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >P2580「于是他错误的点名开始了」

P2580「于是他错误的点名开始了」

作者头像
hotarugali
发布2022-03-01 21:22:33
6980
发布2022-03-01 21:22:33
举报

1. 题目

题目链接:P2580「于是他错误的点名开始了」

题目背景

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

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

题目描述

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

输入格式

第一行一个整数 n,表示班上人数。

接下来 n行,每行一个字符串表示其名字(互不相同,且只含小写字母,长度不超过 50)。

n+2 行一个整数 m,表示教练报的名字个数。

接下来 m 行,每行一个字符串表示教练报的名字(只含小写字母,且长度不超过 50)。

输出格式

对于每个教练报的名字,输出一行。

如果该名字正确且是第一次出现,输出 OK,如果该名字错误,输出 WRONG,如果该名字正确但不是第一次出现,输出 REPEAT

输入输出样例

输入 #1
代码语言:javascript
复制
5  
a
b
c
ad
acd
3
a
a
e
输出 #1
代码语言:javascript
复制
OK
REPEAT
WRONG

说明/提示

  • 对于 40\% 的数据,n \leq 1000m \leq 2000
  • 对于 70\% 的数据,n \leq 10^4m \leq 2 \times 10^4
  • 对于100\%的数据,n \leq 10^4m \leq 10^5

2. 题解

分析

定睛一看,字典树板子题,结束。

代码

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;

// 字典树
struct Trie {
    #ifndef _TRIE_
    #define ll int
    #define MAXN 500005
    #define MAXCHAR 26
    #endif
    ll cnt;                     // 动态开点(开 Trie 树结点编号)
    ll next[MAXN][MAXCHAR];     // 记录关联边为对应字符的子结点的下表
    ll exist[MAXN];             // 记录以该结点结尾的字符串是否存在
    Trie(): cnt(0) {}
    // 插入字符串
    void insert(char *str, ll len) {
        ll p = 0;
        for(ll i = 0; i < len; ++i) {
            ll c = str[i] - 'a';
            if(!next[p][c]) {
                next[p][c] = ++cnt;
            }
            p = next[p][c];
        }
        exist[p] = 1;
    }
    // 查找字符串
    ll find(char *str, ll len) {
        ll p = 0;
        for(ll i = 0; i < len; ++i) {
            ll c = str[i] - 'a';
            if(!next[p][c]) {
                return false;
            }
            p = next[p][c];
        }
        return exist[p] ? exist[p]++ : exist[p];
    }
};

int main()
{
    ll n, m;
    char str[MAXN];
    static Trie t;
    scanf("%d", &n);
    for(ll i = 0; i < n; ++i) {
        scanf("%s", str);
        t.insert(str, strlen(str));
    }
    scanf("%d", &m);
    for(ll i = 0; i < m; ++i) {
        scanf("%s", str);
        ll ret = t.find(str, strlen(str));
        if(ret > 1) {
            printf("REPEAT\n");
        } else if(ret == 1) {
            printf("OK\n");
        } else {
            printf("WRONG\n");
        }
    }
    return 0;
}
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
    • 题目背景
      • 题目描述
        • 输入格式
          • 输出格式
            • 输入输出样例
              • 输入 #1
              • 输出 #1
            • 说明/提示
            • 2. 题解
              • 分析
                • 代码
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                http://www.vxiaotou.com