codeforces Edu 142 D. Fixed Prefix Permutations 【思维、字典树求LCP】

D. Fixed Prefix Permutations

D

题意

给定 n n n 个长度为 m m m排列 a 1 , a 2 , . . . a n a_1,a_2,...a_n a1,a2,...an

定义一个排列 p p p价值最大顺序长度 k k k p 1 = 1 , p 2 = 2 , p 3 = 3 , . . . p k = k p_1 = 1,p_2 = 2, p_3 = 3, ... p_k = k p1=1,p2=2,p3=3,...pk=k,如果 p 1 ≠ 1 p_1 \neq 1 p1=1,那么 p p p 的价值为 0 0 0

定义两个排列的 乘积 为: p ⋅ q = r ,其中 r j = q p j p \cdot q = r,其中 r_j = q_{p_j} pq=r,其中rj=qpj

现在对于每个 i ∈ [ 1 , n ] i \in [1, n] i[1,n],求出 最大 a i ⋅ a j a_i \cdot a_j aiaj(注意 j j j 可以等于 i i i

思路

对于当前的 a i a_i ai,我们需要找到一个 j j j,使得 a i ⋅ a j = ( 1 , 2 , 3 , 4 , . . . . k , r k + 1 , . . . . r m ) a_i \cdot a_j = (1,2,3,4,....k, r_{k + 1},....r_m) aiaj=(1,2,3,4,....k,rk+1,....rm) 中的 k k k 最大
如果 k k k 刚好等于 m m m 的话, a i ⋅ a j = ( 1 , 2 , 3 , 4 , . . . . , m ) a_i \cdot a_j = (1, 2, 3, 4,...., m) aiaj=(1,2,3,4,....,m)

此时我们转换一下: a i = ( 1 , 2 , 3 , 4 , . . . , m ) ⋅ a j − 1 a_i = (1,2,3,4,..., m) \cdot a_j ^ {-1} ai=(1,2,3,4,...,m)aj1

不难发现,对于一个顺序度为 m m m 的排列 ( 1 , 2 , 3 , 4 , . . . , m ) (1,2,3,4, ..., m) (1,2,3,4,...,m),它乘上 a j − 1 a_j ^ {-1} aj1 不会改变 a j − 1 a_j ^ {-1} aj1 的内容

也就是: a i = a j − 1 a_i = a_j ^ {-1} ai=aj1
更一般地,当 k < m k < m k<m 时, a i a_i ai 的前 k k k 位 与 a j − 1 a_j ^ {-1} aj1 的前 k k k 位是 一样 的!

那么我们只需要求出每个 a i a_i ai,然后再与当前的 a i a_i ai 比较,最长公共前缀就是当前 a i a_i ai 的答案

如何求逆?由 p ⋅ p − 1 = [ 1 , 2 , 3 , 4 , . . . , m ] p \cdot p ^ {-1} = [1,2,3,4,..., m] pp1=[1,2,3,4,...,m] 得: p p j − 1 = j p ^ {-1}_{p_j} = j ppj1=j,也就是以 p p p 为下标映射, p j p_j pj 指向的位置一定得为 j j j

那么我们只需要将每个逆存在 T r i e Trie Trie 上,对于当前的 a i a_i ai T r i e Trie Trie 上跑 L C P LCP LCP (最大公共前缀)即可

时间复杂度: O ( n m ) O(nm) O(nm)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;const int INF=0x3f3f3f3f;
const long long INFLL=1e18;typedef long long ll;const int N = 500050;struct node{int son[11];
}tree[N];int cnt = 0;int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int t;std::cin >> t;while(t--){int n, m;std::cin >> n >> m;std::vector<int> ans(n + 1, 0);std::vector<std::vector<int>> a(n + 1, std::vector<int>(m + 1, 0));fore(i, 1, n + 1)fore(j, 1, m + 1)std::cin >> a[i][j];fore(i, 1, n + 1){std::vector<int> b(m + 1);fore(j, 1, m + 1) b[a[i][j]] = j;int now = 0;fore(j, 1, m + 1){ //Trie 插入 排列的逆int val =  b[j];if(!tree[now].son[val]) tree[now].son[val] = ++cnt;now = tree[now].son[val];}}fore(i, 1, n + 1){int now = 0;fore(j, 1, m + 1){ //Trie 查询最长前缀int val = a[i][j];if(!tree[now].son[val]) break;++ans[i];now = tree[now].son[val];}}fore(i, 1, n + 1) std::cout << ans[i] << " \n"[i == n];fore(i, 0, cnt + 1) //清空 Triefore(j, 1, m + 1)tree[i].son[j] = 0;cnt = 0;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在编程中使用中文到底该不该??

看到知乎上有个热门问题&#xff0c;为什么很多人反对中文在编程中的使用&#xff1f; 这个问题有几百万的浏览热度&#xff0c;其中排名第一的回答非常简洁&#xff0c;我深以为然&#xff1a; 在国内做开发&#xff0c;用中文写注释、写文档&#xff0c;是非常好的习惯&…

产品经理功法修炼(2)之专业技能

点击下载《产品经理功法修炼(2)之专业技能》 1. 前言 产品经理的能力修炼并非局限于某一技能的速成,而是需要全面参与到产品的整个生命周期中,通过不断的实践来逐步提升自己的各项能力。尽管在企业的日常运作中,我们不可能身兼数职去扮演每一个角色,但作为产品的核心负…

【适用于福彩3D和体彩排列3】012路直选代码对照表

在我的第6套算法中&#xff0c;我用自己搭建的AI模型&#xff0c;对012路直选进行了预测&#xff0c;但是由于没有对照表&#xff0c;导致很多朋友无法看懂预测结果。众所周知&#xff0c;对于012路直选&#xff0c;共计27种组合方式。我自己进行了组合分类&#xff0c;并赋予相…

建立mysql测试数据

建立一个多数据&#xff0c;多字段的大表&#xff0c;索引有意不全&#xff0c;用于多线程测试 1.建表 /*Navicat Premium Data TransferSource Server : duoSource Server Type : MySQLSource Server Version : 80300 (8.3.0)Source Host : localhost:…

LeetCode 209 长度最小的子数组(滑动窗口,双指针实现)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

微知识-git rebase常用的3个场景和2个本质

如何修改历史提交的commit 的msg信息 r &#xff0d; git rebase -i xxxx 其中xxx是需要修改的commit的father , -i 是指交互式 &#xff0d; 将pick 修改为r 表示修改commit msg &#xff0d; 其他的不要动 git rebase的原理是&#xff0c;在交互式界面好比是输入命令&#x…

[C/C++] -- 二叉树

1.简介 二叉树是一种每个节点最多有两个子节点的树结构&#xff0c;通常包括&#xff1a;根节点、左子树、右子树。 满二叉树&#xff1a; 如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。深度为k&a…

创研杯赛事:激发英语热情,助力人才培养

2024 中国翻译协会年会期间&#xff0c;知名赛事活动平台赛氪承办的“AI 科技时代竞赛与就业”分论坛&#xff0c;于 3 月 30 日下午在长沙圆满落幕。其中值得瞩目的是&#xff0c;第三届”创研杯“大赛也在本次会议上进行了启动。 创研杯赛事由空中英语教室杂志社发起主办&am…

【解决问题】排查linux文件手动删除文件,但是文件标记为deleted,资源未释放

背景&#xff1a; 生产环境我们把程序生成的数据文件手动删除后&#xff0c;但是空间并没有释放&#xff0c;导致硬盘被占用&#xff0c;不够用 问题排查&#xff1a; 1.查看占用文件状态 使用命令&#xff1a; lsof | grep deleted 查看 文件已经删除了&#xff0c;但是都是…

Oracle学习之路:从小白到专家

一、引言 A. 博客文章的目的和背景 本博客的目的是为那些想要学习Oracle数据库的人提供一个初步的指南&#xff0c;帮助他们从小白到专家的过程。Oracle是一种广泛使用的关系型数据库管理系统&#xff0c;具有广泛的应用场景&#xff0c;因此深入学习Oracle是一个有意义的投资…

C语言 | Leetcode C语言题解之第5题最长回文子串

题目&#xff1a; 题解&#xff1a; char* longestPalindrome(char* s) {int lenstrlen(s),max0;int p0;for(int i0;i<len;i)//这种是判断奇数回文{int lefti-1,righti1;//left左边&#xff0c;right右边while(left>0&&right<len&&s[left]s[right]){/…

自定义多阶段倒计时实现分段倒计时

直接贴代码好了 情况是这么个情况 老板想要一个倒计时完毕后再接下一个倒计时总共四五个算一轮业务结束的这个样子 然后循环执行这个业务,这些循环执行我就用了xxl-job ,整体业务就用信号量执行了,总的来说是返回给前端的时间是零误差的, 业务处理的都用异步去执行保证时间总的…

【JavaScript】使用 NVM 管理 Node.js 版本

风决定要走 云怎么挽留 曾经抵死纠缠放空的手 情缘似流水覆水总难收 我还站在你离开 离开的路口 你既然无心 我也该放手 何必痴痴傻傻纠缠不休 是情深缘浅 留一生遗憾 还是情浅缘深 一辈子怨偶 &#x1f3b5; 庄心妍《以后的以后》 Node.js 是一个广泛使用…

10.图像高斯滤波的原理与FPGA实现思路

1.概念 高斯分布 图像滤波之高斯滤波介绍 图像处理算法|高斯滤波   高斯滤波(Gaussian filter)包含很多种&#xff0c;包括低通、高通、带通等&#xff0c;在图像上说的高斯滤波通常是指的高斯模糊(Gaussian Blur)&#xff0c;是一种高斯低通滤波。通常这个算法也可以用来模…

FME学习之旅---day19

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 如何使用 Esri 模板地理数据库 在学习之初&#xff0c;首先了解什么是Esri模板、如何使用Esri模板以及如何创建Esri模板 有两种类型的 Esri 模板&#xff1a;文件地理数据库 &#xff08;.gd…

环信IM集成教程——Web端UIKit快速集成与消息发送

写在前面&#xff1a; 千呼万唤始出来&#xff0c;环信Web端终于出UIKit了&#xff01;&#x1f389;&#x1f389;&#x1f389; 文档地址&#xff1a;https://doc.easemob.com/uikit/chatuikit/web/chatuikit_overview.html 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开…

JavaScript 中数组方法

JavaScript 中有很多用于操作数组的方法&#xff0c;以下是一些常用的数组方法&#xff1a; 目录 push(): 向数组的末尾添加一个或多个元素&#xff0c;并返回新的长度。 pop(): 删除数组的最后一个元素&#xff0c;并返回该元素的值。 shift(): 删除数组的第一个元素&…

DLL导出API注意事项

文章目录 问题原则示例一解决方案 示例二解决方法 参考 问题 在 windows 平台下&#xff0c;如果在动态库的接口中使用 std::string 或其它 std 容器&#xff0c;会导致崩溃或其它内存问题&#xff0c;所以一般要求动态库的接口必须是 C 语言实现。 原则 一个原则&#xff1a;…

专题三_二分查找(3)

目录 153. 寻找旋转排序数组中的最小值 解析 题解 LCR 173. 点名 解析 题解 153. 寻找旋转排序数组中的最小值 153. 寻找旋转排序数组中的最小值 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:int findMin(vector<int>& nums) …

【OpenCV】 基础入门(一)初识 Mat 类 | 通过 Mat 类显示图像

&#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&#xff1a;锡兰_CC ❣️&#x1f4dd; 专 栏&#xff1a;【OpenCV • c】计算机视觉&#x1f308; 若有帮助&#xff0c;还请关注➕点赞➕收藏&#xff…