数据结构部分备忘
树状数组(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