字符串

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;
    }
}
posted @ 2022-05-31 18:38  蒟蒻jht  阅读(34)  评论(0)    收藏  举报