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.hqwc.cn/news/588728.html

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

相关文章

【威胁情报综述阅读3】Cyber Threat Intelligence Mining for Proactive Cybersecurity Defense

【威胁情报综述阅读1】Cyber Threat Intelligence Mining for Proactive Cybersecurity Defense: A Survey and New Perspectives 写在最前面一、介绍二、网络威胁情报挖掘方法和分类A. 研究方法1&#xff09; 第 1 步 - 网络场景分析&#xff1a;2&#xff09; 第 2 步 - 数据…

MySQL 8.0.13安装配置教程

写个博客记录一下&#xff0c;省得下次换设备换系统还要到处翻教程&#xff0c;直接匹配自己常用的8.0.13版本 1.MySQL包解压到某个路径 2.将bin的路径加到系统环境变量Path下 3.在安装根目录下新建my.ini配置文件&#xff0c;并用编辑器写入如下数据 [mysqld] [client] port…

使用 Docker 部署 Puter 云桌面系统

1&#xff09;Puter 介绍 :::info GitHub&#xff1a;https://github.com/HeyPuter/puter ::: Puter 是一个先进的开源桌面环境&#xff0c;运行在浏览器中&#xff0c;旨在具备丰富的功能、异常快速和高度可扩展性。它可以用于构建远程桌面环境&#xff0c;也可以作为云存储服…

“由于找不到opencv_world3413.dll,无法继续执行代码”的解决方法

问题 在Windows系统中&#xff0c;编译完涉及到opencv的项目后&#xff0c;提示&#xff0c; 由于找不到opencv_world3413.dll&#xff0c;无法继续执行代码 解决方法 在编译好的opencv的bin文件内&#xff08;如&#xff1a;D:\code\vs2017\opencv\build\x64\vc15\bin&…

springboot 项目整合easy-captcha验证码功能

效果 1、验证码使用easy-captcha,在pom文件增加依赖 <!-- google 验证码 --><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId></dependency> 2、增加获取kaptcha的ctrl package com.*.*.s…

[C语言实现]数据结构二叉树之《我种下的树会为我遮阳挡雨》

&#x1f970;作者: FlashRider &#x1f30f;专栏: 初阶数据结构 &#x1f356;知识概要&#xff1a;详解二叉树的概念、二叉树的遍历、以及代码实现。 目录 树的基本概念 树的存储结构与二叉树的实现 树的存储 什么是二叉树 二叉链存储二叉树 二叉树的代码实现 树的基本…

大数据学习第十一天(复习linux指令3)

1、su和exit su命令就是用于账户切换的系统命令 基本语法&#xff1a;su[-] [用户名] 1&#xff09;-表示是否在切换用户后加载变量&#xff0c;建议带上 2&#xff09;参数&#xff1a;用户名&#xff0c;表示切换用户 3&#xff09;切换用户后&#xff0c;可以通过exit命令退…

09. 【Android教程】表格布局 TableLayout

学完了 Android 两个经典布局&#xff0c;是不是觉得已经可以应对大多数场景了&#xff1f;我记得当我学完 LinearLayout 和 RelativeLayout 之后&#xff0c;我觉得 UI 布局已经可以出师了&#xff0c;在本人从事了多年的 Android 研究之后&#xff0c;可以很负责任的告诉你&a…

华为OD面试手撕算法-合并排序数组

题目描述 本题是leetcode一道简单题&#xff1a;合并两个有序数组&#xff0c;但是对于时间和空间复杂度面试官明确给出了限制。 // 给定两个排序后的数组 A 和 B&#xff0c;其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法&#xff0c;将 B 合并入 A 并排序。 // 初始化…

5G PLMN相关概念

PLMN PLMN&#xff08;Public Land Mobile Network&#xff0c;公用陆地移动网络&#xff09;&#xff0c;是由政府或其批准的经营者为公众提供陆地移动通信业务而建立、经营的网络。PLMN与公众交换电话网&#xff08;PSTN&#xff09;互连&#xff0c;形成整个地区或国家规模…

SpringCloud微服务技术栈

1.认识微服务 服务治理 分布式架构的要考虑的问题: 服务拆分粒度如何?服务集群地址如何维护?服务之间如何实现远程调用?服务健康状态如何感知? Springcloud SpringCloud是目前国内使用最广泛的微服务框架。官网地址:Spring Cloudhttps://spring.io/projects/spring-cloud…

车载电子电器架构 —— 局部网络管理汇总

车载电子电器架构 —— 局部网络管理汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…