首页 > 其他分享 >CF213E Two Permutations

CF213E Two Permutations

时间:2022-12-26 13:23:39浏览次数:62  
标签:hash CF213E 线段 Permutations Two pos Splay 序列 写法

好久没有交流题目了啊,回来补一下之前的哈。

题目

要使 $a_1+x$,$a_2+x$,$\cdots$,$a_n+x$ 是$b$序列的子序列。这里最烦的部分应该就是子序列是不连续的。

注意到$a$序列是排列,所以不管$x$的值是多少,$a_1+x$,$a_2+x$,$\cdots$,$a_n+x$ 这个序列的值一定是连续的$n$个数。再加上$b$序列也是排列,所以想到一种极为套路的方法:记$pos[b_i]=i$。这样之后可以用类似two pointer那样每次取$pos$数组连续的$n$个数,然后判断这$n$个数所代表的$b$的子序列是否对应$a$序列整体加上某一个值的结果。

关于这里的如何判断,肯定要用两者的hash值来判断是否完全相等。考虑如何计算两者的hash值。注意到在two pointer的两个指针向右移动的过程,每次向右移动一个,就相当于$a$数组整体加1,那么$a$的hash值就加上$\sum_{i=1}^{n}k^i$。所以如何计算$a$的问题解决,考虑如何计算$b$的hash值。这一部分我用到的是Splay但是考虑到用Splay实现比较抽象,所以这里介绍与Splay写法思想相同的线段树写法,Splay写法同理。线段树的插入方式为对于当前要插入的$pos_i$,在线段树的$pos_i$的位置插入$i$。计算此时线段树中元素的hash值是就比较正常的计算,如果当先位置没有插入数字就忽略该位置。

Code

标签:hash,CF213E,线段,Permutations,Two,pos,Splay,序列,写法
From: https://www.cnblogs.com/nebula-xy/p/17005439.html

相关文章