题解 SP4033 【PHONELST - Phone List】
水一发trie板子~
先说这个题怎么套上板子
首先我们判断是否有前缀可以边插入边判断
当我们经过了一个完整的字符串(即当前节点到了一个有标记的节点上)
就是有前缀
我们当然也可以无脑先判断一发(比如我这个)
然后无脑插入就是
减少了一定的编程难度
然后我丧心病狂异想天开写了一发动态的trie
指针警告
好处是内存省下来了
当然删除的时间上来说是省不下来了
具体看代码(代码向预警)
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
//字典集合大小
const int Z=10;
struct trie{
//Z个子节点
trie *ch[Z];
//是否存在字符串的标记挂载
bool vst;
}rt,*root=&rt;//根节点
//输入用的字符串
string input;
void insert(string str)
{
if (str.size()<1)return ;//空字符串返回
trie *now=root;//从根节点开始向下插入
for (register int i=0;i<str.size();i++)
{
int num=str[i]-'0';//子节点下标
if (now->ch[num]==NULL)//需要开一个新的节点
{
now->ch[num]=new trie();//纳新
//初始化节点(也可以写到构造函数里
for (register int j=0;j<Z;j++)
{
now->ch[num]->ch[j]=NULL;//设置成空
now->ch[num]->vst=false;//设置不存在当前子节点表示的字符串
}
now=now->ch[num];//向下一个节点移动
}
else now=now->ch[num];//向下一个节点移动
}
now->vst=true;//挂载当前字符串
}
bool find(string str)
{
if (str.size()<1)return true;//空字符串走人
trie *now=root;//从根节点开始
for (register int i=0;i<str.size();i++)
{
int num=str[i]-'0';//下标
//如果存在没有插入的节点,而且没有经过任何一个完整的字符串,
//一定是不存在任何一个字符串与其为前缀关系
if (now->ch[num]==NULL)return false;
else
{
//经过一个完整的字符串,即经过的这个字符串
//是str的前缀
if (now->ch[num]->vst)return true;
now=now->ch[num];//向下一个节点移动
}
}
//存在另一个字符串包含这个字符串
//即有另一个字符串使得这个字符串是其前缀
return true;
}
//无脑删除,回收空间
void dfs(trie *now)
{
for (register int i=0;i<10;i++)
{
if (now->ch[i]!=NULL)
dfs(now->ch[i]);
}
if (now!=root)delete now;
}
//重新建树
void build()
{
dfs(root);
for (register int i=0;i<10;i++)
{
root->ch[i]=NULL;
}
root->vst=false;
}
int main()
{
int T,n;
cin>>T;
while (T--)
{
bool flag=false;
//先重新建空树
build();
cin>>n;
while (n--)
{
cin>>input;
//只要是存在前缀关系就行
flag=find(input)||flag;
insert(input);
}
//存在即NO
puts(flag?"NO":"YES");
}
return 0;
}
题解 SP4033 【PHONELST - Phone List】的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 《JAVA设计模式》之访问者模式(Visitor)
在阎宏博士的<JAVA与模式>一书中开头是这样描述访问者(Visitor)模式的: 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要 ...
- CCNA 之 二 OSI七层模型
OSI网际互联 OSI的概念 英文全称Open System Interconnect 开放系统互联参数模型,是由ISO国际标准化组织 定义的.它是个灵活的.稳健的和可互操作的模型,并不是协议,使用来 ...
- GNU MAKE 笔记
最近在调试OJ, 忙了4天多, 最后的问题是judge模块不能正常工作. judge 模块就是两个C++源文件, 它的工作是 从数据库获取用户提交的源码 测评 将测评结果写到数据库 测评部分是与数据库 ...
- secureCRT安装,破解,连接linux机器(含安装包)
1. 为什么需要安装secureCRT 我们的项目运行在服务器上,如果出现什么问题,或者升级的时候,需要对服务器进行操作,把处理好的项目发布到服务器上.如果我们就在服务器身边,那么直接在服务器上进行操 ...
- mysql-时间格式
SELECT DATE_FORMAT('2019-1-1 15:1:1.099','%Y-%m-%d %H:%i:%s.%f') -- 2019-01-01 15:01:01.099000 %a 缩 ...
- DMA的认识
DMA的简单了解与认识 DMA就是为了减轻CPU的负担来设置的存储方式.当从外设取到的数据就不需要经过内核操作,而是通过DMA直接把外设的数据放到内存SRAM中,这样就会减少CPU的负担,让CPU在此 ...
- SELECT COUNT语句
数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查. 在数据库的增删改查操作中,使用最频繁的就是查询操作.而在所有查询操作中,统计数量操作更 ...
- nginx各版本全自动编译安装脚本
#!/bin/bash #作者:星云法师(头条号:西西图图---专注美食领域的研究) #环境:centos7,如果是其它的系统可以相应做调整.#--------选择安装方式,网络晚装还是本地安装--- ...
- Java疯狂讲义笔记——内部类
[定义]内部类:定义在其它类内部的类.外部类:包含内部类的类,也称 宿主类.局部内部类:定义在方法里的内部类. [接口内部类]接口中也可以定义内部类,必须为public static修饰(自动添加), ...
- java 两个对象共使一个方法