此题可以用STL中的map做,但是了解一下Trie树这个数据结构也是必须的。

Trie树(又称字典树)有以下特点:

  1. 根节点不包含字符,除它之外的每一个节点都包含一个字符。

  2. 从根节点到某一节点,路径上经过所有字符连起来为该节点对应字符串

  3. 每个节点的子节点包含字符不同,也就意味着字符是可以公用的

于是我们用这样一个结构体表示每一个节点:

在本题中可以用动态数组vector贮存每个子节点

         struct node{
char c;//该点对应字符
vector<struct node*>s;//储存儿子
int tag;//标记是否为某一字符串结尾
int rep; //应题目要求判断是否重复
}*root=new struct node;

当然字典树有两个函数必不可少,分别是add(插入)和query(查询)。

具体怎么实现还看代码:

    #include <cstdio>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>
using namespace std;
struct node{
char c;
vector<struct node*>s;
int tag;
int rep;
}*root=new struct node;
void add(string str)
{
struct node*p=root;
for(int i=0;i<str.length();i++)
{
int j;
for(j=0;j<p->s.size();j++)
if(p->s[j]->c==str[i])break;//如果找到对应公用字符
if(j==p->s.size())//如果遍历完后没找到新建一个
{
struct node *newnode =new struct node;
newnode->c=str[i];
newnode->s.clear();
newnode->tag=0;
newnode->rep=0;
p->s.push_back(newnode);
p=newnode;
}
else p=p->s[j];
}
p->tag=1;//标志此节点为一字符串结尾
}
int query(string str)
{
struct node*p=root;
for(int i=0;i<str.length();i++)
{
int j;
for(j=0;j<p->s.size();j++)
if(p->s[j]->c==str[i])
{break;}
if(j==p->s.size()) //如果遍历完后没找到
return 0;
p=p->s[j];
}
if(p->rep!=3)
{
p->rep=3;return p->tag;//找到的字符可能只是某一前缀而非整个字符串,所以需要一个tag标记
}
else if(p->rep==3)return p->rep;
}
int main()
{
int n,m;
char tag[50];
cin>>n;
root->s.clear();
for(int i=1;i<=n;i++)
{
string str;
cin>>str;
add(str);
}
cin>>m;
for(int i=1;i<=m;i++)
{
string str;
cin>>str;
int flag=query(str);
if(flag==0)puts("WRONG");
else if(flag==1)puts("OK");
else if(flag==3)puts("REPEAT");
}
return 0;
}

Trie树(字典树)-题解 P2580 【于是他错误的点名开始了】的更多相关文章

  1. 剑指Offer——Trie树(字典树)

    剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种的单词.对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位 ...

  2. AC自动机——1 Trie树(字典树)介绍

    AC自动机——1 Trie树(字典树)介绍 2013年10月15日 23:56:45 阅读数:2375 之前,我们介绍了Kmp算法,其实,他就是一种单模式匹配.当要检查一篇文章中是否有某些敏感词,这其 ...

  3. Trie(字典树)

    没时间整理了,老吕又讲课了@ @ 概念 Trie即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种,典型应用是统计和排序大量的字符串(不限于字符串) Trie字典树主要用于存储字符串, ...

  4. 9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第9章  查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚 ...

  5. P2580 于是他错误的点名开始了(trie)

    P2580 于是他错误的点名开始了 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉 ...

  6. luogu P2580 于是他错误的点名开始了

    luogu  P2580 于是他错误的点名开始了 https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边 ...

  7. Luogu P2580 于是他错误的点名开始了 Trie树 字典树

    字典树裸题.每次插入询问串,查询的时候拿出来直接查,信息保留在节点上. #include <bits/stdc++.h> using namespace std; char s[51]; ...

  8. [LintCode] Implement Trie 实现字典树

    Implement a trie with insert, search, and startsWith methods. Have you met this question in a real i ...

  9. Trie树|字典树(字符串排序)

    有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n). Trie树又名字典树,从字面意思即可理解,这种树的结构像英 ...

  10. Trie - leetcode [字典树/前缀树]

    208. Implement Trie (Prefix Tree) 字母的字典树每个节点要定义一个大小为26的子节点指针数组,然后用一个标志符用来记录到当前位置为止是否为一个词,初始化的时候讲26个子 ...

随机推荐

  1. SVG-JS操作

    JavaScript操作 DOM操作 如果 SVG 代码直接写在 HTML 网页之中,它就成为网页 DOM 的一部分,可以直接用 DOM 操作. <svg id="mysvg" ...

  2. SQL-W3School-总结:SQL 快速参考

    ylbtech-SQL-W3School-总结:SQL 快速参考 1.返回顶部 1. 来自 W3School 的 SQL 快速参考.可以打印它,以备日常使用. SQL 语句 语句 语法 AND / O ...

  3. python 过滤 b'及提取 cmd命令返回值

    #!/usr/bin/env python # -*- coding:utf-8 -*- import subprocess import datetime plist = [] p = subpro ...

  4. IDEA新建本地项目关联远程git仓库

    现在远程git仓库创建一个repository,然后本地创建项目,最后进行关联.三板斧,打完收工. 第一步.第二步地球人都知道,略过不表,第三步比较关键,举个例子: 0.创建本地Git仓库:VCS - ...

  5. Sass(Syntactically Awesome Stylesheets)——概述(待续)

    官网地址:http://sass.bootcss.com/ Sass(Syntactically Awesome Stylesheets) Sass 是成熟.稳定.强大的 CSS 扩展语言. 特征 兼 ...

  6. delphi字符串分隔函数用法实例

    这篇文章主要介绍了delphi字符串分隔函数用法,通过自定义函数SeparateTerms2实现将字符串分割后存入字符串列表的功能,具有一定的实用价值,需要的朋友可以参考下 本文实例讲述了delphi ...

  7. Egret入门学习日记 --- 第十五篇(书中 6.1~6.9节 内容)

    第十五篇(书中 6.1~6.9节 内容) 好的,昨天完成了第五章. 今天来看第六章. 总结重点: 1.如何对组件进行分组? 跟着做: 重点1:如何对组件进行分组? 首先,选中你想要组合的组件. 然后点 ...

  8. 【数据库开发】Redis key-value内存数据库介绍

    Redis是一个开源的,先进的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案.Redis官方网网站是:http://www.redis.io/,如下: Redis 有 ...

  9. mybatis 一对多,多对一配置

    一. 简介: 本实例使用顾客和订单的例子做说明: 一个顾客可以有多个订单, 一个订单只对应一个顾客 二. 例子: 1. 代码结构图: 2. 建表语句: CREATE DATABASE test; US ...

  10. Git使用两个用户名两个公钥链接同一个Git服务器

    同篇文章以Gitee举例, 支持国产, 首先关联一下我的另外一篇文章: 在码云上添加公钥时提示不允许重复添加(实际上当前公钥数为0) 在这篇文章中, 我后续有补充解释为什么会出现我之前没有弄明白的这个 ...