模板总结——基于哈希的LCP问题

11人阅读 评论(0) 收藏 举报
分类:

问题引入

求第i位开始的后缀和第j位开始的后缀的最长公共前缀的长度?

高度数组&&RMQ

求出高度数组lcp,假设rank[i]小于rank[j],那么后缀i和后缀j的LCP值等于min{lcp[rank[i],lcp[rank[i+1],…lcp[rank[j]-1}.
预处理RMQ即可O(1)查询LCP值。但由于是预处理RMQ,无法动态回答LCP回答。也就是说一旦题目中有对字符串修改的操作,则此方法无法解决。

基于哈希的LCP

给每一个子串一个哈希值,这样子串改变时只需对应地修改哈希值即可。
定h(i)表示后缀S[i…]的哈希值。
定义hash(i,L)表示以i为起始位置、长度为L的子串的哈希值。

h(n-1)=s[n-1] 边界
h(i)=h(i+1)*x+s[i] 递推
一般地,

h[i]=s[i]+s[i+1]*x+s[i+2]*x^2+...+s[n-1]*x^(n-1-i);

hash(i,L)的哈希值定义如下

hash(i,L)=s[i]+s[i+1]*x+s[i+2]*x^2+...+s[i+L-1]*x^(L-1)

推导后,

hash(i,L)=h[i]-h[i+L]*x^L;

所以预处理h和x^L后就可以在常数时间内计算出hash(i,L)。hash值可能很大,这里用unsigned long long去存,这样在算术运算时会自然溢出,相当于模2^64.

解决问题:
二分答案L,如果hash(i,L)==hash(j,L),那么就认为以LCP(i,j)>=len.

模板

const int x=123;//随便取一个x
unsigned long long h[maxn],xp[maxn];
int n;
string s;

void get_hxp()
{
    n=s.size();
    h[n]=0;
    for(int i=n-1;i>=0;i--)
        h[i]=h[i+1]*x+s[i]-'a';
    xp[0]=1;
    for(int i=1;i<=n;i++)
        xp[i]=xp[i-1]*x;
}
unsigned long long Hash(int i,int L)
{
    return h(i)-h(i+L)*xp[L];
}
查看评论

2014北京邀请赛 J 题 基于哈希值的LCP算法

题意:给定a和b两个字符串,有b匹配a在keyi
  • u013573047
  • u013573047
  • 2014-06-06 19:12:50
  • 1289

UVA 12206 Stammering Aliens(基于哈希值的LCP算法)

UVA 12206 Stammering Aliens(基于哈希值的LCP算法) 题意:给你一个字符串s和m,求出字符串中至少出现m次的最长子串.如果有多解,输出最长字符串的长度以及它出现的最大位置...
  • u013480600
  • u013480600
  • 2014-04-20 22:03:30
  • 1031

LCP

LCP总结。
  • zzkksunboy
  • zzkksunboy
  • 2017-03-14 19:24:30
  • 507

uvalive 4513 Stammering Aliens (基于Hash的LCP+二分)

题目:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&pr...
  • w20810
  • w20810
  • 2015-09-14 13:19:25
  • 476

uva12338 - Anti-Rhyme Pairs 询问最长公共前缀 HASH+二分

Often two words that rhyme alsoend in the same sequence of characters. We use this property to defin...
  • corncsd
  • corncsd
  • 2015-01-03 17:53:45
  • 524

【HackerRank】Functional Palindromes(回文树+后缀数组+lcp排序+字符串哈希+二分)

【HackerRank】Functional Palindromes(回文树+后缀数组+lcp排序+字符串哈希+二分)这个页面抓不太好,大家点进去看吧~~做过的用到数据结构+算法最多的一个题……真真是...
  • ChallengerRumble
  • ChallengerRumble
  • 2016-08-29 18:59:54
  • 849

【模板】后缀自动机 LCP

先贴,今天太晚,明天填坑。 题目描述太不良心了,误解了题意*n #include #include #include #define N 2000005 using namespace std; ...
  • yxr0105
  • yxr0105
  • 2016-05-15 23:17:50
  • 841

后缀数组求lcp(模版,st模版把

算模版?,不过这东西,顺着思路很好写啊,注意log的强制类型转环就行了
  • zhhx2001
  • zhhx2001
  • 2016-08-12 11:48:48
  • 405

hdu 4691 lcp最长公共前缀 后缀数组经典模板

每行无论公共前缀是多少,都要一个空格和换行,+2 注意公共前缀的长度 #include #include #include using namespace std; #define N 10...
  • Jackyguo1992
  • Jackyguo1992
  • 2013-08-21 16:45:28
  • 2304

最长公共前缀(LCP)

http://vjudge.net/contest/view.action?cid=47286#problem/C Description Homer: Marge, I just...
  • u013573047
  • u013573047
  • 2014-06-06 17:27:03
  • 1813
    个人资料
    持之以恒
    等级:
    访问量: 3282
    积分: 1142
    排名: 4万+
    文章存档