请求添加一组Hack数据
查看原帖
请求添加一组Hack数据
125124
ywy_c_asm楼主2020/11/1 15:56

我的做法是这样的:

把两个串拼一块,搞出后缀数组,对于AA的每个长度>=k>=k的后缀ii(它对应了一个长度=k=k的子串),去找一个在后缀数组中离它最近的后缀jj(这样能使两者的LCPLCP尽可能大),这可以二分,这个jj对应了BB的一个长度=k=k的子串,然后把(i,j)(i,j)塞到大根堆里。每次贪心找LCPLCP最大的一对,把答案加上kLCP(i,j)k-LCP(i,j)

但是这样有可能jj已经被别的ii用过了,这时我直接让ii再在后缀数组上找一个此时没被用过的且离它最近的jj,然后重新扔到堆里。

然而我写着写着就发现它的复杂度是假的,因为一个jj可能会被很多个ii指向,当jj被取出后,可能会引起很多的“重新找个没被用过的jj扔到堆里”的操作,出堆次数会被卡成O(n2)O(n^2)

然后我写完之后交上去试了试……它A了……

然后我随便构造了一个n=150000,k=3n=150000,k=3,两个字符串里全是a的数据,造了个私题在luogu评测机上试了下,发现这样即使开O2我的假做法也要跑到1s多,而使用SAM的题解仅20多ms……

输入数据

(输出数据仅有一个数 0)

我的假做法代码

2020/11/1 15:56
加载中...