数据结构部分备忘

树状数组(BIT)

例题 UVa 1428

KMP

模板

void GetFail(int *P, int *f)
{
    f[0] = f[1] = 0;
    int m = strlen(P);
    for (int i = 1; i < m; i++)
    {
        int j = f[i];
        while (j && P[j] != P[i]) j = f[j];
        f[i + 1] = (P[j] == P[i] ? j + 1 : 0);
    }
}
 
void KMP(int *T, int *P, int *f)
{
    GetFail();
    int cnt = 0;
    int n = strlen(P), m = strlen(T);
    int j = 0;
    for (int i = 0; i < m; i++)
    {
        while (j && P[j] != T[i]) j = f[j];
        if (P[j] == T[i]) j++;
        if (j == n) return i - j + 1;
    }
    return cnt;
}

一些性质

如果i % (i - f[i]),那么这个字符串的最小循环节就是(i - f[i])。

证明在这http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html

Powered by Jekyll and Theme by solid