字符串hash进阶
对于一个字符串,可以用一个数值来表示(下面输入字符串中只含有小写字母,若还有其他的字符,注意改变式子)
const int MOD=1000000007;
const int P=10000019;
long long hashFunc(string S)
{
long long id=0;
for(int i=0;i<S.length();i++)
{
id=(id*P+S[i]-'a')%MOD;
}
return id;
}
通用公式为:
H[i]=(H[I-1]*P+index(str[i]))%mod
H[i]表示[0,i]区间内的字符构成字符串所代表的数值
当要求[i,j]所构成的子串所代表的数值时,则采用如下公式:
H[i…j]=((H[j]-H[i-1]*pj-i+1)%mod+mod)%mod
KMP算法
int nextval[1001];
void getNextval(string s)
{
int j=-1;
nextval[0]=-1;
for(int i=1;i<s.length();i++)
{
while(j!=-1&&s[i]!=s[j+1])
{
j=nextval[j];
}
if(s[i]==s[j+1])
{
j++;
}
if(j==-1||s[i+1]!=s[j+1])
{
nextval[i]=j;
}
else
{
nextval[i]=nextval[j];
}
}
}
bool KMP(char text[],char pattern[])
{
int n=strlen(text),m=strlen(pattern);
getNextval(pattern);
int j=-1;
for(int i=0;i<n;i++)
{
while(j!=-1&&text[i]!=pattern[j+1])
{
j=nextval[j];
}
if(text[i]==pattern[j+1])
{
j++;
}
if(j==m-1)
{
return true;
}
}
return false;
}