首页 > 其他分享 >Master of Both —— Trie的应用

Master of Both —— Trie的应用

时间:2024-05-23 21:18:23浏览次数:13  
标签:Both le Trie ret int ch Master rel 字符串

Trie 树

所有在老鼠岛上的老鼠都应该学习Trie树!——伟大的吱嘎鼠

Trie树,就是所有Oier们喜闻乐见的字符串的超级优化的数据结构!

已阅,狗屁不通。——吱嘎鼠

字典树,顾名思义,是一颗很像字典的树,将相同前缀的字符串合并在一起,当出现不同时就分支,成为这样的树。
Trie树

在这样的树上,我们可以很快地完成关于前缀的问题。

Master of Both 题面

先看题面~

Hui-Bot教授是弦论和高级数据结构的大师,所以他提出了一个有趣的问题。给定一个仅由小写英文字母组成的 \(n\) 字符串序列,当按字典顺序比较字符串时,该序列中有多少个反转?

作为Hui-Bot最出色的学生,普塔塔和布达达分别掌握了高超的弦理论和先进的数据结构技能,他们轻松地一起解决了这个问题。然而,存在 \(q\) 个不同的平行宇宙,其中字母表中的字符并不按原始顺序出现。

形式上,每个宇宙中的字母都是一个字符串,它是26小写英文字母的排列,表示每个字符出现的顺序。

当且仅当以下条件之一成立时,字符串 \(a\) 按字典顺序小于字符串 \(b\) :

\(a\) 是 \(b\) 的前缀,但 \(a \ne b\) ;
在a和b不同的第一个位置,字符串a有一个字母在字母表中出现的时间早于b中对应的字母。
长度n的序列a中的反转次数是满足 $ 1 \le i \le j \le n$ 、 \(a_j < a_i\) 的有序对(i,j)的数量。

请帮助各个宇宙的普塔塔和布达达解决问题。

输入 $1 \le n \le 5 \cdot 10^5 $ , $ 1 \le q \le 5 \cdot 10^4 $

\(1 \le \lvert s_i \rvert \le 10^6\) \(\lvert si \rvert\) 的总和不大于 \(10 ^ 6\)

鼠的思路

这道题要看的是字符串,一个一个比较过去复杂度岂不是会爆炸awa
所以将所有对都记录下来,看看其他时间的单词表里这个对是不是逆序的,用字典树预处理就好啦!

ll trie[N][37], cnt = 0, sm[N], rel[37][37];
void insert(string s){
	int p = 0;
	for(auto c : s){
		int u = c - 'a' + 1;//为什么要 + 1,那当然是因为有的坏字符串是别的字符串的前缀,所以要在后面加一个比 $a$ 字典序都小的东西
		if(!trie[p][u]) trie[p][u] = ++cnt;
		for(int j = 0; j <= 26; j++){//看看自己的“同事”,记录对
			if(j == u)continue;
			rel[j][u] += sm[trie[p][j]];//有时候一个点会挤着很多字符串
		}
		sm[p = trie[p][u]] ++;//锵锵,统计一下
	}
}

接下来就是要统计了

while(q--){
		string s; cin >> s;
		ll ret = 0;
		for(int i = 0; i < 26; i++){
			ret += rel[s[i] - 'a' + 1][0];
			for(int j = 0; j < i; j++) ret += rel[s[i] - 'a' + 1][s[j] - 'a' + 1];
		}
		write(ret), putchar('\n');
	}

我知道你们想看什么——AC Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>
void write(T x){
    if(x < 0)putchar('-'),x = -x;
    if(x > 9)write(x / 10);
    putchar(x % 10 + '0');
}
template<class T>
inline T read(){
    T x = 0, f = 1;char ch = getchar();
    while(ch < '0'||ch > '9'){if(ch == '-') f = -1;ch = getchar();}
    while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
    return x * f;
}
template<class T> inline T read(T &x){ return x = read<ll>();}
int n, q;
const int N = 2e6 + 100;
ll trie[N][37], cnt = 0, sm[N], rel[37][37];
void insert(string s){
	int p = 0;
	for(auto c : s){
		int u = c - 'a' + 1;
		if(!trie[p][u]) trie[p][u] = ++cnt;
		for(int j = 0; j <= 26; j++){
			if(j == u)continue;
			rel[j][u] += sm[trie[p][j]];
		}
		sm[p = trie[p][u]] ++;
	}
}
int main(){
	read(n), read(q);
	for(int i = 1; i <= n; i++){
		string s; cin >> s;
		s += 'a' - 1; insert(s);
	}
	while(q--){
		string s; cin >> s;
		ll ret = 0;
		for(int i = 0; i < 26; i++){
			ret += rel[s[i] - 'a' + 1][0];
			for(int j = 0; j < i; j++) ret += rel[s[i] - 'a' + 1][s[j] - 'a' + 1];
		}
		write(ret), putchar('\n');
	}
}

标签:Both,le,Trie,ret,int,ch,Master,rel,字符串
From: https://www.cnblogs.com/o2mouse/p/18209372

相关文章

  • Bridging Language and Items for Retrieval and Recommendation
    目录概BLaIR代码HouY.,LiJ.,HeZ.,YanA.,ChenX.,andMcAuleyJ.Bridginglanguageanditemsforretrievalandrecommendation.2024.概本文提出了一种利用对比损失训练的预训练模型,能够把握数据集中的交互信息.BLaIRBLaIR的思想很简单如上图所示,输入......
  • $ git push -u origin "master"
    $gitpush-uorigin"master"Tohttps://gitee.com/ee/0523.git ![rejected]       master->master(non-fast-forward)error:failedtopushsomerefsto'https://gitee.com/ee/0523.git'hint:Updateswererejectedbecauseapushedbra......
  • 带你彻底搞懂递归时间复杂度的Master公式
    1.什么是Master公式1.1Master公式的定义Master公式,又称为Master定理或主定理,是分析递归算法时间复杂度的一种重要工具,尤其适用于具有分治结构的递归算法。\[T(n)=a*T(n/b)+O(n^d)\]Master公式本身就是递归的形式,是递归方法时间复杂度的一种表示法。T(n)代表递归方法处......
  • FSMO(Flexible Single Master Operation)
    首先,ActiveDirectory是集中式存储库(centralrepository),其中存储企业中的所有对象及其各自的属性。它是一个分层(hierarchical)多主(Multi-master)模型的数据库。无论域控制器(DC)联网与否,都可以在企业中任意给定的DC上处理对数据库的更改。这当中,[多主]意味着可......
  • K8S多master节点更换证书
    以下命令master节点均需要执行1.备份cp-a/etc/kubernetes{,.bak}cp-a/var/lib/kubelet{,.bak}cp-a/var/lib/etcd/var/lib/etcd.bak2.生成kubeadm-configkubectl-nkube-systemgetcmkubeadm-config-oyaml>kubeadm-config-20240521.yaml3.刷新证书到期时间再......
  • C# enum parse enumtype and name to retrieve enum
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApp35{internalclassProgram{staticvoidMain(string[]args){ParseEnumDemo();......
  • 01trie专题
    01trie特训2题意:给定一个含有n个元素的数组Ai,你可以选择两个不相交的子段。求出这两个子段内的数的异或和的差值的最大值。Sol:考虑枚举两段的分界点,对于较短的两段来说可能会有多个分界点但这样我们求的是答案的超集,一定会包括答案的。对于一个分界点,我们先考虑如果要求以左......
  • 【字典树】【TRIE】
    本质最多有二十六个节点的树(假设只看小写英文字母)。空间换时间nex[p]是一个节点,根据c的取值最多有26个分支,nex[p][c]存的是下一个节点有意思的情况:为什么Trie的树用数组实现,二叉树用指针实现:当创建和使用Trie树时,以下是一般的步骤和操作:创建Trie树的节点结构:通常使用一个......
  • dbeaver连接mysql报错Public Key Retrieval is not allowed
    这个错误通常发生在尝试通过JDBC连接MySQL数据库时,并且是由于MySQL的配置不允许公钥检索导致的。从MySQL5.0开始,连接时默认需要使用密钥进行密码加密传输。如果JDBC驱动程序尝试通过不允许公钥检索的方式进行连接,就会抛出这个错误。解决方法:更新JDBC连接字符串,添加允许公钥检......
  • Kibana系列---【重新启动kibana后,访问一直显示:Kibana server is not ready yet,查看
    重新启动kibana后,访问一直显示:Kibanaserverisnotreadyyet,查看后台错误日志报master_not_discovered_exception1.问题描述我的kibana之前都是好的,我把es集群重启之后,再重启kibana,发现无法访问了,访问时一直报:Kibanaserverisnotreadyyet,查看服务器后台日志后发现报:m......