字符串
1.哈希
哈希永远的神!!!
哈希将一段字符串的每一个子串都可以用前缀和差分来表示,并能比较两个字符串是否相同,配合二分等算法,可以一较优的复杂度去实现一些字符串子段问题
2.KMP
KMP是一种字符串循环节求解问题的一种方法,具体来说,KMP维护了一个nxt数组,表示从位置1到位置i的字符串中最长的一段前缀等于后缀。
点击查看代码
for(int i=2,j=0;i<=n;++i){
while(j&&a[i]!=a[j+1]) j=nxt[j];
if(a[i]==a[j+1]) j++;
nxt[i]=j;
}
KMP还维护了一个f数组,表示从位置1到位置i的字符串中最长的一段模式串前缀等于母串后缀。
点击查看代码
for(int i=1,j=0;i<=m;++i){
while(j&&(j==n||b[i]!=a[j+1])) j=nxt[j];
if(b[i]==a[j+1]) j++;
f[i]=j;
}
3.Manacher
Manacher是一种求解回文串的算法它
点击查看代码
s[0] = '$'; s[++m] = '#';
for (b = 1; ss[b] != '\0'; ++b) {
s[++m] = ss[b];
s[++m] = '#';
}
s[++m] = '?';
for (int i = 1; i < m; ++i) {
if (maxid > i) p[i] = min(maxid-i, p[2*id-i]);
else p[i] = 1;
while (s[i-p[i]] == s[i+p[i]]) p[i]++;
if (i + p[i] > maxid) {
maxid = i + p[i];
id = i;
}
}