这道题可能是近期写过的最纠结的一道题了。之前一直没有看过suffix array,这次必须看了。
geeksforgeeks上面有通俗易懂的O(nlognlogn)的实现:http://www.geeksforgeeks.org/suffix-array-set-2-a-nlognlogn-algorithm/。但我不清楚是否卡时间。
最好的资料还是discuss中大家都提到的罗穗骞大神的实现:https://github.com/oeddyo/algorithm/blob/master/resources/%E7%89%9B%E4%BA%BA%E8%B0%88ACM%E7%BB%8F%E9%AA%8C(%E5%8C%85%E6%8B%AC%E5%9B%BD%E5%AE%B6%E9%9B%86%E8%AE%AD%E9%98%9F%E8%AE%BA%E6%96%87)/%E5%9B%BD%E5%AE%B6%E9%9B%86%E8%AE%AD%E9%98%9F%E8%AE%BA%E6%96%87/%E5%9B%BD%E5%AE%B6%E9%9B%86%E8%AE%AD%E9%98%9F2009%E8%AE%BA%E6%96%87%E9%9B%86/11.%E7%BD%97%E7%A9%97%E9%AA%9E%E3%80%8A%E5%90%8E%E7%BC%80%E6%95%B0%E7%BB%84%E2%80%94%E2%80%94%E5%A4%84%E7%90%86%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%9C%89%E5%8A%9B%E5%B7%A5%E5%85%B7%E3%80%8B/%E5%90%8E%E7%BC%80%E6%95%B0%E7%BB%84%E2%80%94%E2%80%94%E5%A4%84%E7%90%86%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%9C%89%E5%8A%9B%E5%B7%A5%E5%85%B7.pdf
后缀数组本不容易,所以需要费些功夫理解,虽然罗穗骞大神的解释已经非常通俗易懂了。
最终我只是大致了解了大神的程序,这里照搬了源程序(俗称“模板”)。
解题思路是将两个string合成一个,然后看后缀的最长共同前缀(longest common prefix, LCP)。这是后缀数组的一个常见应用。
需要注意的是,需要保证两个后缀来自不同的string,最简单的办法是在第一个string后面加一个从未出现过的字符,比如'$'。这里有很好的解释:http://poj.org/showmessage?message_id=85977。
由于模板程序需要在字符串后面加个`0`(sa中将排在第一位)。所以n, n - 1, 0, 1之类的要区分清楚。
贡献了很多WA和RE,不过也是个理解加深的过程。
thestoryofsnow |
2774 |
Accepted |
5640K |
344MS |
C++ |
5079B |
/*
ID: thestor1
LANG: C++
TASK: poj2774
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include