魔族密码

题目背景

风之子刚走进他的考场,就……

花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花)

风之子:我呕……(杀死人的眼神)快说题目!否则……-_-###

题目描述

花花:……咦好冷我们现在要解决的是魔族的密码问题(自我陶醉:搞不好魔族里面还会有人用密码给我和菜虫写情书咧,哦活活,当然是给我的比较多拉*_*)。

魔族现在使用一种新型的密码系统。每一个密码都是一个给定的仅包含小写字母的英文单词表,每个单词至少包含 1 个字母,至多 75 个字母。如果在一个由一个词或多个词组成的表中,除了最后一个以外,每个单词都被其后的一个单词所包含,即前一个单词是后一个单词的前缀,则称词表为一个词链。例如下面单词组成了一个词链:

  • i
  • int
  • integer

但下面的单词不组成词链:

  • integer
  • intern

现在你要做的就是在一个给定的单词表中取出一些词,组成最长的词链,就是包含单词数最多的词链。将它的单词数统计出来,就得到密码了。

风之子:密码就是最长词链所包括的单词数阿……

输入格式

这些文件的格式是,第一行为单词表中的单词数 N1 ≤ N ≤ 2000),下面每一行有一个单词,按字典顺序排列,中间也没有重复的单词。

输出格式

输出共一行,一个整数,表示密码。

样例 #1

样例输入 #1

5
i
int
integer
intern
internet

样例输出 #1

4

tire基本板子

//插入
int son[N][M],idx;//N的取值一般是最大字符长度*字符个数,M的取值由字符串由什么构成决定
bool cnt[N];
//这里M取26
void insert(char str[]){
int p=0,u;
for(int i=0;str[i];i++){
u=str[i]-'a';//将小写字母转换为数组方便存储
if(!son[p][u]) son[p][u]=++idx;//如果字符串中的某一个字符在字典树中不存在,则创建该字符的节点
p=son[p][u];//此时p就是当前str[i]中最后一个字符对应的字典树树的位置idx
}
cnt[p]=1;//在p位置上打个标记,说明该字符串出现过
}
//查询
//查询的代码类似,可以看上面的注释来理解
bool query(char str[]){
int p=0,u;
for(int i=0;str[i];i++){
u=str[i]-'a';
if(!son[p][u])return false;
p=son[p][u];
}
return cnt[p];
}

AC Code

// Problem:
// P1481 魔族密码
//
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1481
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org) #include<iostream>
#include<algorithm>
//#include<cstdio>
#include<cstring>
#define ll long long
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define per(i,a,b) for(int i=(a);i>(b);i--)
#define N 150100 //1e6+100 using namespace std;
int son[N][26],idx;
char in[2010][80];
bool cnt[N];
void insert(char str[]){
int p=0,u;
for(int i=0;str[i];i++){
u=str[i]-'a';
if(!son[p][u])son[p][u]=++idx;
p=son[p][u];
//cnt[p]=cnt[p-1]+1;
}
cnt[p]=true;
}
bool query(char str[]){
int p=0,u;
for(int i=0;str[i];i++){
u=str[i]-'a';
if(!son[p][u])return false;
p=son[p][u];
}
return cnt[p];
}
int main(){
//ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>in[i];
insert(in[i]);
}
int MAX=0;
char tmp[80],MAXstr[100];
//这边采用暴力查找
for(int i=0;i<n;i++){
int res=0;
for(int j=1;j<=strlen(in[i]);j++){
memset(tmp,0,sizeof tmp);//要用memset是因为strncpy不会把后面的元素置为'\0',所以可能会产生运行中计算的错误。
strncpy(tmp,in[i],j);
if(query(tmp))res++;
}
MAX=max(MAX,res);
}
cout<<MAX<<endl;
return 0;
}

P1481魔族密码 题解(字典树)的更多相关文章

  1. 洛谷 P1481 魔族密码

    P1481 魔族密码 题目描述 风之子刚走进他的考场,就…… 花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花) 风之子:我呕……(杀死人的眼神)快说题目!否则……-_-### 花 ...

  2. P1481 魔族密码(LIS变形)

    题目描述(题目链接:https://www.luogu.org/problem/P1481) 风之子刚走进他的考场,就…… 花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花) 风之 ...

  3. P1481 魔族密码

    题目描述 风之子刚走进他的考场,就…… 花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花) 风之子:我呕……(杀死人的眼神)快说题目!否则……-_-### 花花:……咦好冷我们现在 ...

  4. P1481 魔族密码 (LIS)

    题的连接:https://www.luogu.org/problemnew/show/P1481 简单思路: 就是LIS,最长上升子序列,当然把条件改一下,从模板里的A[ i ]> A[ j ] ...

  5. 洛谷P1481 魔族密码(LIS)

    题意 题目链接 给出一堆字符串,若一个串是另一个串的前缀 ,那么它们可以连接在一起 问最大的链接长度 Sol LIS沙比提其实是做完了才看出是LIS #include<cstdio> #i ...

  6. FJUT seventh的tired树上路径(01字典树)题解

    思路(来自题解): 众所周知树上两个点xy的距离是deep[x]+deep[y]-deep[lca(x,y)]*2 然后我们把这个加减法换成异或,我们就会发现,deep[lca(x,y)]被消掉了 所 ...

  7. 【字典树】【树】【二进制】bzoj1954/POJ3764The xor-longest Path 题解

        建立字典树是异或的一种处理方法. Description In an edge-weighted tree, the xor-length of a path p is defined as ...

  8. newcoder 筱玛的迷阵探险(搜索 + 01字典树)题解

    题目描述 筱玛是个快乐的男孩子. 寒假终于到了,筱玛决定请他的朋友们一起来玩迷阵探险. 迷阵可以看做一个n×nn×n的矩阵A,每个格子上有一个有一个数Ai,j. 入口在左上角的(1,1)处,出口在右下 ...

  9. HDU 4825 Xor Sum(01字典树)题解

    思路:先把所有数字存进字典树,然后从最高位贪心. 代码: #include<set> #include<map> #include<stack> #include& ...

  10. SPOJ Hacking(字典树 + 搜索)题解

    思路1:字典树存每个串,然后dfs遍历是否存在.这里有个技巧,如果每次都重新初始化字典树为-1,那么会超时,所以我先初始化为-1,然后设一个Case,每个test时Case都++,那么只要开一个数组判 ...

随机推荐

  1. [转帖]7.5 TiKV 磁盘空间占用与回收常见问题

    https://book.tidb.io/session4/chapter7/compact.html TiKV 作为 TiDB 的存储节点,用户通过 SQL 导入或更改的所有数据都存储在 TiKV. ...

  2. [转帖]文件操作之zip、bzip2、gzip、tar命令

    文件操作之zip.bzip2.gzip.tar命令 原创 丁同学19902015-10-15 00:02:51博主文章分类:liunx基础著作权 文章标签linux tarlinux文件压缩linux ...

  3. [转帖]CENTOS6.5 没有/LIB64/LIBFUSE.SO.2的问题

    yum install fuse-libs

  4. Jmeter学习之一_连接与测试Redis

    Jmeter学习之一_连接与测试Redis 简介 下载: https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.zip 注意事项: D ...

  5. [转帖] Linux命令拾遗-使用blktrace分析io情况

    https://www.cnblogs.com/codelogs/p/16060775.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 一般来说,想检 ...

  6. 【转帖】71.常用的显示GC日志的参数、GC日志分析、日志分析工具的使用

    目录 1.常用的显示GC日志的参数 2.图解垃圾`GC`日志(重要) 3.日志分析工具的使用 1.常用的显示GC日志的参数 解释: 日志中,GC和Full GC表示的是GC的类型.GC只在新生代进行, ...

  7. [转帖]Linux IO调度之队列、队列深度

    有关数据结构 请求队列:struct request_queue 请求描述符:struct request 队列深度 可以在端口队列中等待IO请求数量: 具体代表其值的是request_queue的成 ...

  8. TienChin 活动管理-搜索活动

    ActivityController @PreAuthorize("hasPermission('tienchin:activity:list')") @GetMapping(&q ...

  9. 【druid切换hikari连接池】通过源码分析遇到的问题

    一.前言说明 如果不会配置druid连接池的话,可以参考我这篇博文:springboot整合druid: springboot整合所有的starter方法基本都差不多,添加依赖,开启注解,编写配置,增 ...

  10. 爱了爱了!推荐一个Github 70k+点赞的Java学习指南!

    大家好,我是 Guide 哥!今天给大家推荐一个非常不错的 Java 教程类开源项目-JavaGuide ,Github 地址: https://github.com/Snailclimb/JavaG ...