KMP板子

纯板子: (原理懂了, 板子随便进行修改)

next[i] 代表的是序列i之前构成的序列的最大公共前后缀的长度.
注意, next对应的字符串下标应该是从0开始的!!! 最好保持这个不变!!! 不要轻易去改动它!!!
通用版(数字和字符, 主要看读入怎么读入):

const int maxn = 1e5 + 5;
char zc[maxn], pp[maxn*100];
int Next[maxn];

template<class T>
void getnext(T *s, int len) {
    int t1 = 0, t2;
    Next[0] = t2 = -1;
    while(t1 < len){
        if(t2 == -1 || s[t1] == s[t2])
            Next[++t1] = ++t2;
        else t2 = Next[t2];
    }
}
int ans ;
template<class T>
void kmp(T *zc, T *pp, int len1, int len2) {
    int i = 0 ,t = 0;
    while(i<len1){
        while (t != -1 && zc[i] != pp[t]) t = Next[t];
        i++; t++;
        if (t == len2) {
            ans ++;
            t = Next[t];
        }
    }
}

模式串: a b c d a b c
next数组: -1 0 0 0 0 1 2

你可能感兴趣的:(KMP/hash字符串问题)