题解 P2580 【于是他错误的点名开始了】
这个题的题解区就没一简单一点的指针题解?(大概是瞎了)
So,这篇题解是给那些想用指针而害怕的同学食用的qwq
记得有一篇题解有个dalao作者放了几个静态模拟的trie树结果最后放了个动态的跑路了.....
(放个板子就跑路真的不好)
所以本蒟蒻来一发1470ms & 63.52MB的——
动态的trie树qwq
另外一开始C++党的朴素想法是这样的(看看你想到了什么):
- 暴力搜索(结果应该是:TLE TLE TLE..... )
- map另类暴力(结果应该是:AC AC ... AC TLE TLE TLE )
- 暴力哈希(结果应该是:AC AC...AC TLE AC... )
- 哈希STL之外的模板(结果应该大概是AC界面)
- STL前缀/二分搜索
竟然AC,WA,好强啊! - STL的set (作者:好,算你狠)
- 静态模拟trie树(结果应该是卡了常数过去了Orz)
- 甚至还有链式前向星写的trie Orz......
- 正解:trie前缀树(动态)
- 玄学平衡树(快走,别理作者了⑧......)
(PHP的数组和STL的玄学做法真叫人质壁分离)
回到正题。
必备知识:指针的用法
- 指针是存储地址的数据类型
- 结构体中引用指针指向的元素需要用到
->
而不是小数点 - 不能访问空指针NULL,NULL是特殊的指针,叫空指针或零指针。
- 如果
p
指向a
,那么*p
相当于a - 指针可以被指针或者地址赋值,但是不能被原元素赋值。
- 新分配给指针一个地址需要用new(c++)或者malloc(c,c++)。用法:
p=new type_T();
(malloc暂时还不会)
Q1:为什么使用指针动态地食用trie?
因为trie是经典的用空间换时间的数据结构,动态指针实现的trie可以用更少的时间最大限度地换回一部分空间。
Q2:为什么使用指针?
指针是结构体实现自引用结构的基础。
——清华大学出版社《c语言XX(第五版)》
Q3:如何实现trie树?
trie树的基本操作是插入,查找,删除操作。这是重点.jpg
首先是插入:
插入只需要两种操作方式:
- 如果有指向
str[i]
的指针,挪到指向str[i]
的指针的位置。 - 如果还没有分配给指向
str[i]
的指针(默认是NULL),那么先将需要的指针分配一个空间,再执行操作1。
然后是查找:
- 如果有指向
str[i]
的指针,挪到指向str[i]
的指针的位置。 - 如果没有指向
str[i]
的指针,直接返回说找不到字符串。 - 如果遍历完了字符串,就范围找到了字符串。
这个题特殊之处在于要多维护一个bool vst
,表示是否已经念过这个字符串。
当遍历完了字符串以后,如果vst==true
,就返回说已经念过了。
否则就vst=true
,然后返回说没问题。
删除操作:
因为用了指针,所以其实也比较简单。
只需要递归到字符串的最后一个元素,然后回溯的时候删除指针即可。
或者开一个指针存一下父亲节点的地址,逆序递推也是可以的。
(本题目没有删除的相关操作)
然后说一下本题思路。
数据结构方面:
每一个trie指针节点存26个节点(表示下一个字符),一个vst(表示是否已经念过这个人名)。
算法方面:
先建一个插入n个字符串的trie,表示原先的人名。
然后查找m次,每次先判断出是否正确,然后会判断出是否已经重复,最后返回没毛病。(我用了unsigned char剩下了一点点空间......)
然后说一下getline毒瘤:是因为字符串最后都有一个换行,getline读入的时候会读进去,所以输出会占用一个空行,所以要么抹掉(substr),要么cin,要么就直接字符数组scanf读入。
最后放上代码:
C++ Code(太丑了,放到剪贴板里)
最后同 Wow_Goodjob dalao:炉石是个非常好的游戏(逃
题解 P2580 【于是他错误的点名开始了】的更多相关文章
- luogu P2580 于是他错误的点名开始了
luogu P2580 于是他错误的点名开始了 https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边 ...
- P2580 于是他错误的点名开始了(trie)
P2580 于是他错误的点名开始了 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉 ...
- 【luogu P2580 于是他错误的点名开始了】 题解
题目链接:https://www.luogu.org/problemnew/show/P2580 我真的永远都爱stl #include <map> #include <cstdio ...
- 洛谷P2580 于是他错误的点名开始了 题解
qwq!为什么!木有非结构体非指针的题解怎么阔以!所以, 我来辽~咻咻咻~ 题面 来分析, 我们可以先建一棵树,来存储整个名单, 然后再判断 ; i <= n; i++) { root = ; ...
- 洛谷 P2580 于是他错误的点名开始了 题解
每日一题 day10 打卡 Analysis trie树模板题,只需用到简单的插入和查询就好了 如果想要学trie树,见信息学奥赛一本通·提高篇P82 #include<iostream> ...
- P2580 于是他错误的点名开始了
题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). ...
- 洛谷 P2580 于是他错误的点名开始了
题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). ...
- 洛谷—— P2580 于是他错误的点名开始了
https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次 ...
- [洛谷P2580]于是他错误的点名开始了
洛谷P2580的一个水题,用啥都能过,不过为了练习一下刚刚学会的字典树,还是认真做一下吧. #include <cstdio> #include <cstring> using ...
- [洛谷P2580]于是他错误的点名开始了(Trie树)
传送门 洛谷P2580的一个水题,用啥都能过,不过为了练习一下刚刚学会的字典树,还是认真做一下吧. #include <cstdio> #include <cstring> u ...
随机推荐
- day42
今日内容: 1.子查询补充 2.正则表达式 3.pymysql 1.子查询补充 什么是子查询? 将上一次查询的结果作为下一次查询的条件或原数据 又称为内查询 作用:当你的需求,一次查询无法满足的时候( ...
- handsontable合并项mergeCells应用及扩展
由于我这个项目主要是配置多表头信息,主要使用了handsontabel合并项功能. 但是,在该功能使用过程中发现了一些问题和一些自己根据需要做的一些扩展 $("#topFieldDiv&qu ...
- Codeforces round 1103
Div1 534 我可能还太菜了.jpg 果然我只是Div 2 选手 A (这题是Div1吗... 直接构造:竖着放的在第一行和第二行,然后横着放的时候直接放在第三行就行. #include < ...
- 课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现
个人贡献 熟悉试验箱各元件功能以及连接组装试验箱 一.实验内容 研究实验箱串口.USB线的调通连接 二.实践步骤 1.打开实验箱,首先了解各元件功能 这个是LTE模块,也叫4G模块,具体的作用是硬件将 ...
- 20155330 《网络对抗》 Exp8 Web基础
20155330 <网络对抗> Exp8 Web基础 实验问题回答 什么是表单 表单可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 一个表单有三个基本组成部分 表单标签 ...
- EZ 2018 04 06 NOIP2018 模拟赛(七)
我是链接 这次是真的惨,码了将近2hours的可持久化线段树炸掉了! 而且本地拍了一万年也没发现哪里炸了. T1 压位的入门题,话说这道题能拿个99分就可以了(100分要FFT) 对于暴力,就是暴力找 ...
- Luogu P2055 [ZJOI2009]假期的宿舍
一道网络有关的问题,还是一句话 网络流重在建模! 这里主要讲两种算法. 1.二分图匹配: 分析题意,我们可以知道题目要求是让所有留在学校的人都能有床睡 而 所有留在学校的人=本校不回家的人+外校的人: ...
- libgdx学习记录1——图片显示Texture
libgdx底层采用opengl渲染,对图片进行了优化处理,与android原生态的bitmap不太一样. 相比而言,效率要高一些,不过只支持png,jpg,bmp三种格式. 显示中,一般将图片放在a ...
- Nuxt 开发 - 项目初始化
Nuxt是基于Vue的一个应用框架,采用服务端渲染(SSR),可以让用户的Vue单页面应用(SPA)也可以有利于SEO. 项目初始化 参考:https://zh.nuxtjs.org/guide/in ...
- 解决 div 设为 inline-block 后标题不对齐
vertical-align 属性设置元素的垂直对齐方式.该属性定义行内元素的基线相对于该元素所在行的基线的垂直对齐.允许指定负长度值和百分比值.这会使元素降低而不是升高.在表单元格中,这个属性会设置 ...