Minimal String Xoration (倍增法dp+字典序+双关键字排序)

题目大意:

  • 给定一个长度为 2^n,只包含小写字母的字符串 ss。
  • 你可以将字符串的下标全部异或一个 [0,2^n) 的整数 k,即构造一个与 s 等长的新字符串 t,使得 t_i=sik
  • 最小化 tt 的字典序,并输出字典序最小的 tt。
  •  1<=n18 

思路:

  • 观察: 一个数来异或下标后得到一个新的排列,(异或和下标)
  • 考虑异或的性质 对于前 2^k个下标的数 i^x= (i+2^k)^(x^2^k)  (记住^运算不满足分配律, 由于前面2^k数,的第k位是0, 于是前面那个等式是成立的)
  • 于是这个等式就把 2边给关联了起来, 引出倍增的方法
  • dp, f[x][j], 表示用x来异或这个序列的前2^k的排名(求字典序最小,可以用排名的方式), f[x][j]的排名就可以由(f[x][j-1],f[x^2^j-1][j-1])来得到2个排名
  • 利用这2个排名来进行双字典序排列,就可以得到 f[x][j]的排名拉

后记:

  • 对dp的补充, dp这个函数他代表的是什么东西很重要,考虑用什么东西来代表才可以将问题给解决是很重要的!!!!

 

posted @ 2022-10-19 10:31  VxiaohuanV  阅读(20)  评论(0编辑  收藏  举报