此题可以用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. Unix/Linux系统下获得时间戳函数

    在Unix/Linux系统下,使用gettimeofday函数来获得当前系统的时间戳,精度可达到微秒(microsecond,即μs)级别. 通过结构体timeval来存放当前时间戳的信息: #ifn ...

  2. utf-8的中文是一个字符占几个字节

    utf-8的中文是一个字符占几个字节 英文字母和中文汉字在不同字符集编码下的字节数英文字母:·字节数 : 1;编码:GB2312 字节数 : 1;编码:GBK 字节数 : 1;编码:GB18030 字 ...

  3. 【转】Selenium-WebDriverApi接口详解

    浏览器操作 # 刷新 driver.refresh() # 前进 driver.forward() # 后退 driver.back() 获取标签元素 # 通过ID定位目标元素 driver.find ...

  4. IDEA中提示Error:java: Compilation failed: internal java compiler error

    解决办法:File-->Setting...-->Build,Execution,Deployment-->Compiler-->Java Compiler 设置相应Modul ...

  5. Laravel 项目开发环境配置

    1.首先安装Laravel 依赖管理包工具 Composer (前提是本地装好了PHP  php -v) php -r "copy('https://install.phpcomposer. ...

  6. jQuery BlockUI Plugin Demo 3(Page Blocking Examples)

    This page demonstrates several ways to block the page. Each button below activates blockUI and then ...

  7. 完全解读 margin 标签

    你真的了解margin吗?你知道margin有什么特性吗?你知道什么是垂直外边距合并?margin在块元素.内联元素中的区别?什么时候该用 padding而不是margin?你知道负margin吗?你 ...

  8. 【Leetcode_easy】703. Kth Largest Element in a Stream

    problem 703. Kth Largest Element in a Stream 题意: solution1: priority_queue这个类型没有看明白... class KthLarg ...

  9. MG7780打印机喷嘴堵塞

    1.深度清洗,打印喷嘴图案,发现有颜色没有打印出来 2.墨盒一加墨水就往外冒,以为是满的,其实是内部已经堵塞而加不进去,因为出墨口并没有墨水向外流(出墨口没有盖起来).解决办法就是用没有针头的针管从加 ...

  10. 【ARTS】01_34_左耳听风-201900701~201900707

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...