牛奶模式(后缀数组)

牛奶模式

对问题的分析设计过程

题目要求序列中的最长的重复k次子序列,为一道经典的后缀数组+height数组例题

将序列求出其后缀数组即其h数组后,我们有$ans=max(RMQ(h[i],h[i+1],…,h[i+k]))$ 为了快速的进行上诉计算,可以考虑随着i的增大来维护一个数据结构,有下列两种方式:

  • 优先队列(堆)
  • 单调队列

程序中用到的数据机构和算法

本程序使用优先队列实现。

在初始化程序时使用离散化来避免初始时的桶排出现桶太大的情况。

程序的运行情况

一共提交了四次才通过,在提交时出现了下列问题:

  • 下标为1为0分不清楚
  • 在初始化时的离散化直接在s数组上修改出现问题

在实习过程中得到的经验和体会

  1. 在打程序时就要考虑到各种各样的边界问题
  2. 改变数组功能需要考虑是否会对后续操作出现冲突
  3. 后缀数组是解决字符串问题的一种利器

Code:

 

GDOI2015 解题报告

首先嘛现在发现题目这么水我还啥都没想出来正是呵呵了。接下来就口胡下GDOI的题解吧

PS:代码什么的要请联系我

题目:快戳我

Day1:

T1:这个嘛,可以先找到起点所能到达的每个点然后判断该点能否到达终点,后一步可以发现如果从终点沿反向边遍历所能得到的所有点就是能到达终点的点,然后扫一下即可

在实现方面建议先把图建出来不要直接按照题意做

T2:

方法一:可以发现当做到第i个人的时候前i-2都已经覆盖,从i+2开始都未被覆盖,也就是说做到第i个人有关状态只有2^5种,然后就可以直接状态压缩dp了,发现n很大,每次的转移方程都是相同的所以我们可以用矩阵乘法优化

方法二:我们本着这个数列一定存在一个递推式的信念暴力出前10的答案,然后高斯消元就可以得到递推式,用高斯消元即可。

如何不用高斯消元呢?

设f[i]为答案,g[i]为长度为i的无法分成两块的方案,那么f[i]=sigma(f[j]*g[i-j]),写出g[i]来可发现从第4项开始就是一个常值数列了,就可以化简成递推式了

T3:

可以先把共抽到炎爆术张数作为x轴,抽到奥术智慧作为y轴,那么模型就变成了从点0,0,出发,每次向x+1或y+1走一步,求到达x=q不经过y=x-1的方案数

怎么求到达点(x,y)不经过y=x-1的方案数呢?

[JLOI]2015骗我呢!!!具体来说就是把起点对y=x-1做对称,那么从对称点到终点的方案就是经过的方案(因为所有方案按y=x-1做翻转都会经过这条直线)

T4:

裸的树链剖分即可

6B的代码有木有!!!人生打的最长的一个程序啊QAQ(k小割这种3合一的程序还只5B)OTZ写了12B的GWY

关于一些优化:我们可以直接把修改变成清零然后再加就可以少掉一堆操作了

当然有超多恶心的细节需要操作

说白了就是防AK题。。。

Day2:

因为没了防AK题就有2人AK一个快A了(OTZ石门众神)

 

T1:裸的广搜题,在判断方块是否能在某点上用8个int或一个unsigned longlong解决即可

T2:裸的找桥,数据很仁慈的不卡系统栈不开心

T3:听说是SA模板题,先处理出sa数组还有h数组然后枚举长度L对每块h[i]大于L的快排下序贪心拿就行了

用基数排序就能N^2了(反正我基数常数太大挂了还是sort好)

然后n sqrt(n) log n的算法忘了。。貌似是块大小小于sqrt(n)的直接排序做,大于n的二分然后干毛忘了。。。。

T4:一道初中知识题,可以看出其实题目意思就是给你一堆m维向量然后让你求点积。考虑点积具有结合律就行啦

Day3:

其实是很水的但就是没水出来。。。

T1:如果记f[i]为k=1时的答案那么f[i]=sigma(f[j]*(i-j-1)!)*c(i-1,i-j-1)+i!化简一下发现能前缀和就直接O(n)解决啦

然后K》=2可以用二项式定理拆开来干

时间复杂度O(nk^2)

T2:

方法一:可以想出O(N^3)方的简单算法,按列处理,对每一列只保留每一行中距离该列最近的点,然后每一行就对这些点进行扫描就能得到最近距离了。

怎么优化到O(N^2)呢。考虑其中两个基站A(x1,y1),B(x2,y2)可以发现对于某个x坐标,A好于b的要求是((x1^2+y1^1)-(x2^2+y2^2))/(2×1-2y1)

这种解法还是非常神奇的,以后看到有平方操作还是得想到斜率优化的

对了我们可以直接使用桶排这样就不用排序了

方法二:其实考场上就是方法二的。。。不过SPFA写错了。。。。

其实也是水法啦,我就是打了一个最短路然后发现如果我是向8个方向拓展好像不会错。。。然后我把dijstra改成SPFA发现好像几乎只会经过一次(也就是说可能可以改成BFS?!)然后就可以解决啦,正确性求证明(考场上就是有4个人用了类似BFS的方法水过的。。)

T3:

方法一:树剖可以把。。。。

方法二:离线然后考虑按边从小到大加入到这个图中,首先有个结论:某个点所能到达的最远点一定是该联通块直径的两端点之一。那么我们用并查集维护联通性,然后记录每个联通块的直径,我们就可以直接搞啦

方法三:其实评委一开始是考在线算法的。。。

还是点剖+主席树,具体又忘了。。等想起来再补吧。。。

T4:

暴力能过。

暴力能过。。

暴力能过。。。

特么暴力Dijstra写挂了!!

最短路跟我过不去系列

好吧讲正解

该题模型可以变成去掉某条边后求两点最短路

那么我们之间上最短路,纪录最短路以及不经过最短路的第一条边的最短路。

完了。。。

 

总的来说题目很水,自己太弱。

滚回去刷CF了,自己语文太弱,英语不行,数学被虐,PKUSC妥妥得跪