自己看看这两份代码哪里不一样。
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 0; i < 2; i++) {
int v = son[u][i];
if (v) {
q.push(v);
int p = fail[u];
while (p && !son[p][i]) {
p = fail[p];
}
if (son[p][i]) {
fail[v] = son[p][i];
d[v] |= d[son[p][i]];
} else {
fail[v] = 0;
}
} else {
son[u][i] = son[fail[u]][i];
}
}
}
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 0; i < 2; i++) {
int v = son[u][i];
if (v) {
q.push(v);
int p = fail[u];
while (p && !son[p][i]) {
p = fail[p];
}
if (p) {
fail[v] = son[p][i];
d[v] |= d[son[p][i]];
} else {
fail[v] = 0;
}
} else {
son[u][i] = son[fail[u]][i];
}
}
}