| i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| S | a | l | p | h | a | b | e | t |
| i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| A | A | A | B | A | A | A | A | A | C |
| j | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| A | A | A | B | A | A | A | |
| F(j) | -1 | 0 | 1 | 0 | 1 | 2 | 3 |
string a, b;
int F[N], cnt;
void KMP(){
cnt = 0;
//prefix function
F[0] = -1, F[1] = 0;
for(int i = 2; i <= b.size(); i++){
int j = F[i-1];
while(j != -1 && b[i-1] != b[j]) j = F[j];
F[i] = (j == -1)?(0):(j+1);
}
//string matching
for(int i = 0, j = 0; i <= a.size();){
if(j == b.size()) cnt++, j = F[j];
else if(a[i] == b[j] || j == -1) i++, j++;
else j = F[j];
}
}| j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| A | A | B | A | B | A | B | A | A | B |
| Z(j) | 0 | 0 | 5 | 0 | 3 | 0 | 1 | 3 | 0 |
string a, b;
int Z[20001], cnt, L_b = b.size();
void gusfield(){
b += "!"; b += a;
Z[0] = 0;
int l = 0, k;
for(int i = 1; i < b.size()-L_b+1; i++){
k = i-l;
if(l+Z[l] <= i){
int j = 0;
while(b[j] == b[i+j]) j++;
Z[i] = j, l = i;
}
else if(l+Z[l] > i+Z[k])
Z[i] = Z[k];
else if(l+Z[l] == i+Z[k]){
int j = Z[k];
while(b[j] == b[i+j]) j++;
Z[i] = j, l = i;
}
else
Z[i] = Z[l]-k;
if(Z[i] == L_b) cnt++;
}
}