首页 > 其他分享 >P1481魔族密码 题解(字典树)

P1481魔族密码 题解(字典树)

时间:2024-01-24 16:34:48浏览次数:31  
标签:cnt P1481 密码 int 题解 son 单词 魔族 str

魔族密码

题目背景

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

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

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

题目描述

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

魔族现在使用一种新型的密码系统。每一个密码都是一个给定的仅包含小写字母的英文单词表,每个单词至少包含 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; 
} 


标签:cnt,P1481,密码,int,题解,son,单词,魔族,str
From: https://www.cnblogs.com/Illuminated/p/17984973

相关文章

  • 【题解 P8575】 星之河
    「DTOI-2」星之河题目背景星稀河影转,霜重月华孤。题目描述星之统治者有一个星盘,其可以被抽象为一棵根节点为\(1\)的树。树上每个节点\(i\)有一颗红星、一颗蓝星,亮度分别记为\(\text{Red}_i,\text{Blue}_i\)。现在,星之统治者想要知道,对于每个节点\(x\),其子树内(不包括......
  • 题解 P9911 [COCI 2023/2024 #2] Kuglice
    传送门。题意应该是显然的.分析首先,观察数据范围:\(1\len\le3000\),也就是说,时间复杂度应当在\(O(n^2)\)左右。其次,观察我们取球的顺序,是只能从左或右取,因此,我们每次留下的必然是连续的一段。所以,我们显然可以采用区间DP来解决这道题。确定状态:\(f_{i,j}\)表示现在取......
  • CF1689A题解
    题意简述给定字符串\(a\)和\(b\),每次从\(a\)串或\(b\)串中选出一个字符加入\(c\)串,要求\(c\)串的字典序最小。特别地,在\(c\)串中不能出现连续\(k\)次来源相同的字符。思维路径由于字符是随意选取的,易于发现每次选\(a\)串中字典序最小的字符或者\(b\)串中字......
  • CF911G Mass Change Queries 题解
    题目链接:CF或者洛谷前置知识点:平衡树合并:CF文章与维基百科看上去这题有很多人用线段树分裂与合并去做,其实这种需要分裂和合并的,我们用文艺平衡树去维护区间信息是最容易写的。考虑本题的特殊性,值域并不是很大,所以其实我们可以为每种值开一棵文艺平衡树,而平衡树维护的值为......
  • [SNOI2024]公交线路 题解
    为啥洛谷现有的题解全是\(O(n^2\logn)\)的做法?给个好写的\(O(n^2)\)做法。感觉这题是这套题中除了D1T1以外最简单的题(显然最远的距离一定由两个叶子贡献,我们拎出一个非叶节点为根,分析一些性质。考虑两个叶子\(u,v\)何时距离\(\le2\),这要求它们所一步能到达的最浅点......
  • 【题解 P4197】 Peaks
    Peaks题目描述在Bytemountains有\(n\)座山峰,每座山峰有他的高度\(h_i\)。有些山峰之间有双向道路相连,共\(m\)条路径,每条路径有一个困难值,这个值越大表示越难走。现在有\(q\)组询问,每组询问询问从点\(v\)开始只经过困难值小于等于\(x\)的路径所能到达的山峰中第\(......
  • 【题解 P3293】 美味
    [SCOI2016]美味题目描述一家餐厅有\(n\)道菜,编号\(1,2,\ldots,n\),大家对第\(i\)道菜的评价值为\(a_i\)。有\(m\)位顾客,第\(i\)位顾客的期望值为\(b_i\),而他的偏好值为\(x_i\)。因此,第\(i\)位顾客认为第\(j\)道菜的美味度为\(b_i\oplus(a_j+x_i)\),\(\opl......
  • 2024寒假集训 进阶训练赛 (六)部分题解
    A统计单词数题解注意是否是单词。CODECPP#include<iostream>#include<string>#include<algorithm>usingnamespacestd;intmain(){stringword,article;getline(cin,word);getline(cin,article);//转换为小写字母transform(word.beg......
  • Romberg 数值积分算法+P3779 题解(马上写完)
    Romberg算法吊打Simpson的且不玄学(没有什么十五倍)的数值积分算法。缺点是过程复杂一点,但是只体现在证明上,代码很短。铺垫算法梯形求积公式公式\[\int_a^bf(x)dx\approx\frac{(f(a)+f(b))(b-a)}2\\\text{令}(1)=\frac{(f(a)+f(b))(b-a)}2\]计算梯形求积公式的误差......
  • 前端打包后上传至服务器,发现css样式都未生效,查看请求preview预览格式不正确问题解决
    参考:https://blog.csdn.net/wzj_110/article/details/112850811 我的问题前端打包后上传至服务器,发现css样式都未生效,查看css请求,发现preview预览格式不正确,Response-Headers里的Content-type未对应 原因服务器的nginx配置中, mime.types文件缺失。 原理 MIME:Multip......