zoukankan      html  css  js  c++  java
  • 题解 P2580 【于是他错误的点名开始了】

    这个题的题解区就没一简单一点的指针题解?(大概是瞎了)

    So,这篇题解是给那些想用指针而害怕的同学食用的qwq

    记得有一篇题解有个dalao作者放了几个静态模拟的trie树结果最后放了个动态的跑路了.....
    放个板子就跑路真的不好
    所以本蒟蒻来一发1470ms & 63.52MB的——

    动态的trie树qwq


    另外一开始C++党的朴素想法是这样的(看看你想到了什么):

    1. 暴力搜索(结果应该是:TLE TLE TLE.....
    2. map另类暴力(结果应该是:AC AC ... AC TLE TLE TLE
    3. 暴力哈希(结果应该是:AC AC...AC TLE AC...
    4. 哈希STL之外的模板(结果应该大概是AC界面)
    5. STL前缀/二分搜索 竟然AC,WA,好强啊!
    6. STL的set (作者:好,算你狠)
    7. 静态模拟trie树(结果应该是卡了常数过去了Orz)
    8. 甚至还有链式前向星写的trie Orz......
    9. 正解:trie前缀树(动态)
    10. 玄学平衡树(快走,别理作者了⑧......)

    (PHP的数组和STL的玄学做法真叫人质壁分离)


    回到正题。

    必备知识:指针的用法

    1. 指针是存储地址的数据类型
    2. 结构体中引用指针指向的元素需要用到->而不是小数点
    3. 不能访问空指针NULL,NULL是特殊的指针,叫空指针或零指针。
    4. 如果p指向a,那么*p相当于a
    5. 指针可以被指针或者地址赋值,但是不能被原元素赋值。
    6. 新分配给指针一个地址需要用new(c++)或者malloc(c,c++)。用法:p=new type_T();malloc暂时还不会

    Q1:为什么使用指针动态地食用trie?

    因为trie是经典的用空间换时间的数据结构,动态指针实现的trie可以用更少的时间最大限度地换回一部分空间。

    Q2:为什么使用指针?

    指针是结构体实现自引用结构的基础。
    ——清华大学出版社《c语言XX(第五版)》

    Q3:如何实现trie树?

    trie树的基本操作是插入,查找,删除操作。这是重点.jpg

    首先是插入:

    插入只需要两种操作方式:

    1. 如果有指向str[i]的指针,挪到指向str[i]的指针的位置。
    2. 如果还没有分配给指向str[i]的指针(默认是NULL),那么先将需要的指针分配一个空间,再执行操作1。

    然后是查找:

    1. 如果有指向str[i]的指针,挪到指向str[i]的指针的位置。
    2. 如果没有指向str[i]的指针,直接返回说找不到字符串。
    3. 如果遍历完了字符串,就范围找到了字符串。

    这个题特殊之处在于要多维护一个bool vst,表示是否已经念过这个字符串。
    当遍历完了字符串以后,如果vst==true,就返回说已经念过了。
    否则就vst=true,然后返回说没问题。

    删除操作:

    因为用了指针,所以其实也比较简单。
    只需要递归到字符串的最后一个元素,然后回溯的时候删除指针即可。
    或者开一个指针存一下父亲节点的地址,逆序递推也是可以的。
    (本题目没有删除的相关操作)


    然后说一下本题思路。
    数据结构方面:
    每一个trie指针节点存26个节点(表示下一个字符),一个vst(表示是否已经念过这个人名)。
    算法方面:
    先建一个插入n个字符串的trie,表示原先的人名。
    然后查找m次,每次先判断出是否正确,然后会判断出是否已经重复,最后返回没毛病。(我用了unsigned char剩下了一点点空间......)
    然后说一下getline毒瘤:是因为字符串最后都有一个换行,getline读入的时候会读进去,所以输出会占用一个空行,所以要么抹掉(substr),要么cin,要么就直接字符数组scanf读入。
    最后放上代码:
    C++ Code(太丑了,放到剪贴板里)


    最后同 Wow_Goodjob dalao:炉石是个非常好的游戏(逃

  • 相关阅读:
    Phabricator实践(2):配置——通知服务(Notifications )
    Phabricator实践(3):代码审核——提交前Review vs 提交后Audit(Review vs Audit)
    node.js安装(CentOS)
    Phabricator实践(2):配置——配置Repository
    Phabricator实践(3):代码审核——提交后Audit
    Phabricator实践(4):其他功能——Phriction(WIKi)
    Phabricator实践(2):组织结构——账户角色(Account Role)
    Python27的安装
    Phabricator实践(4):其他功能——Phame (BLOG)
    Phabricator实践(3):代码审核——为代码库设定Packege及其Owner
  • 原文地址:https://www.cnblogs.com/jelly123/p/10543308.html
Copyright © 2011-2022 走看看