c++ 实现KMP算法
前言
字符串匹配要回答的问题是:在文本串 text 中找出模式串 pat 的每一次出现。朴素做法在失配时把模式串整体右移一位、从头再比,最坏情况下会反复比较已经确认过的字符,复杂度达到 O(n·m)。KMP 算法(Knuth–Morris–Pratt)利用模式串自身的前后缀信息,失配时只回退模式串的指针、不回头扫描文本,把复杂度降到 O(n+m)。
常见的误解是把 KMP 的 next 数组当成「失败时跳到哪个下标」的魔法表,背下代码却说不清含义。另一种误解是认为 KMP 在任何输入上都比朴素匹配快——当模式串很短或字符集很大、失配很快发生时,KMP 的预处理和常数开销反而可能更明显。它的价值在于最坏情况的可预测性,而不是每个场景的绝对速度。
本文从「最长相等前后缀」这个定义出发推导 next 数组,再给出 C++17 的完整实现,并说明下标类型、空模式串、重叠匹配这些容易出错的地方。
一、next 数组到底记录了什么
对模式串的每个前缀 pat[0..i],定义 next[i] 为:该前缀的最长相等真前缀与真后缀的长度。「真」表示长度小于 i+1,即不能是自身。例如 pat = "ababaca":
| i | 前缀 | 最长相等真前后缀 | next[i] |
|---|
| 0 | a | 无 | 0 |
| 1 | ab | 无 | 0 |
| 2 | aba | "a" | 1 |
| 3 | abab | "ab" | 2 |
| 4 | ababa | "aba" | 3 |
| 5 | ababac | 无 | 0 |
| 6 | ababaca | "a" | 1 |
这个长度的意义在于:如果我们在 pat[j] 处失配,说明 pat[0..j-1] 已经和文本的某一段匹配成功。这段文本的后缀等于 pat[0..j-1] 的后缀,而 next[j-1] 告诉我们这段后缀里有多长的部分同时是模式串的前缀。把模式串右移到这个前缀对齐的位置,那些字符必然仍然匹配,不需要重新比较。于是 j 从 j 回退到 next[j-1],文本指针 i 不动。
二、递推构造 next
构造过程本身就是一次「模式串和自己匹配」。设 j 是当前已匹配的前缀长度,i 从 1 开始扫描:
- 若
pat[i] == pat[j],则j加一,next[i] = j。
- 若不等且
j > 0,令j = next[j-1],继续比较,直到相等或j == 0。
- 若
j == 0且仍不等,next[i] = 0。
第 2 步的反复回退是 KMP 线性的关键。j 每次回退都严格变小,而在整个循环中 j 最多增加 n 次,所以总回退次数不超过总增加次数,均摊 O(n)。
需要注意 next[0] 恒为 0:单字符前缀没有真前缀。如果代码里从 i = 0 开始并访问 next[j-1],当 j == 0 时就会下标下溢,这是无符号类型尤其危险的地方。
三、完整实现
// 适用于 C++17
#include <cstddef>
#include <string>
#include <vector>
// next[i] = pat[0..i] 的最长相等真前后缀长度
std::vector<std::size_t> buildNext(const std::string& pat) {
std::vector<std::size_t> next(pat.size(), 0);
std::size_t j = 0;
for (std::size_t i = 1; i < pat.size(); ++i) {
while (j > 0 && pat[i] != pat[j]) {
j = next[j - 1];
}
if (pat[i] == pat[j]) {
++j;
}
next[i] = j;
}
return next;
}
std::vector<std::size_t> kmpSearch(const std::string& text,
const std::string& pat) {
std::vector<std::size_t> positions;
if (pat.empty()) {
return positions; // 空模式串的匹配位置没有统一约定,直接返回空
}
const std::vector<std::size_t> next = buildNext(pat);
std::size_t j = 0;
for (std::size_t i = 0; i < text.size(); ++i) {
while (j > 0 && text[i] != pat[j]) {
j = next[j - 1];
}
if (text[i] == pat[j]) {
++j;
}
if (j == pat.size()) {
positions.push_back(i + 1 - pat.size());
j = next[j - 1]; // 允许重叠匹配,例如 "aaa" 中找 "aa"
}
}
return positions;
}逐行核对几个边界:
buildNext中i从 1 开始,pat[i]与pat[j]的访问范围分别是[1, n-1]和[0, n-1]。由于j <= i,pat[j]不会越界。
- 搜索循环里,进入循环体时
j < pat.size()恒成立:上一轮若j达到pat.size(),会立刻被重置为next[j-1] < pat.size()。因此pat[j]安全。
i + 1 - pat.size()不会下溢,因为能走到j == pat.size()说明从i - pat.size() + 1起已经匹配了整整一段。
- 找到一次匹配后执行
j = next[j-1],而不是清零。这样"aaaa"中找"aa"会得到位置 0、1、2,符合「允许重叠」的语义;若业务要求不重叠,应改为j = 0并明确文档。
一个简单的调用示例:
// 适用于 C++17
#include <iostream>
#include <string>
int main() {
const std::string text = "abababcababaca";
const std::string pat = "ababa";
for (std::size_t pos : kmpSearch(text, pat)) {
std::cout << pos << '\n';
}
return 0;
}按标准语义,匹配位置应当是文本中每次完整出现该模式串的起始下标;具体输出取决于输入,不需要在这里给出固定数字。
四、复杂度与适用边界
预处理 O(m),搜索 O(n+m),额外空间 O(m)。相比之下,朴素算法最坏 O(n·m),但在随机文本上平均往往接近线性。KMP 的优势是最坏情况有上界,适合模式串较长、文本可能包含大量重复前缀的场景,例如基因序列、日志模板匹配。
如果只需要判断「是否存在」而不需要所有位置,可以在第一次命中时立即返回,省去后续扫描。如果模式串固定、文本经常变化,可以只构造一次 next 并复用;反之每次调用都重建 next 会增加 O(m) 开销。对于多模式匹配,KMP 需要为每个模式各跑一遍,此时应考虑 Aho–Corasick 自动机,而不是把 KMP 硬套上去。
常见坑点
- ❌
next数组从i = 0开始填。
// 适用于 C++17
for (std::size_t i = 0; i < pat.size(); ++i) { /* ... */ }✅ next[0] 固定为 0,从 1 开始递推。
// 适用于 C++17
std::vector<std::size_t> next(pat.size(), 0);
for (std::size_t i = 1; i < pat.size(); ++i) { /* ... */ }
- ❌ 失配时用
next[j]回退。
// 适用于 C++17
j = next[j]; // j 可能等于 pat.size(),越界;语义也不对✅ 回退到「已匹配部分」的最长 border,即 next[j-1]。
// 适用于 C++17
j = next[j - 1];
- ❌ 用
int存下标并与size()比较。
// 适用于 C++17
for (int i = 0; i < text.size(); ++i) // 有符号/无符号比较,可能警告或溢出✅ 统一用 std::size_t,或显式转换并确认范围。
// 适用于 C++17
for (std::size_t i = 0; i < text.size(); ++i)
- ❌ 空模式串直接进入循环。
// 适用于 C++17
const auto next = buildNext(pat); // pat 为空时 next 为空
if (text[i] == pat[j]) // pat[0] 越界✅ 在入口处单独处理空模式串。
// 适用于 C++17
if (pat.empty()) { return {}; }
- ❌ 找到匹配后把
j清零,漏掉重叠出现。
// 适用于 C++17
positions.push_back(i + 1 - pat.size());
j = 0; // "aaa" 中找 "aa" 只能找到一处✅ 用 next[j-1] 保留可复用的前缀。
// 适用于 C++17
positions.push_back(i + 1 - pat.size());
j = next[j - 1];
- ❌ 在
buildNext中把while写成if。
// 适用于 C++17
if (j > 0 && pat[i] != pat[j]) { j = next[j - 1]; }✅ 失配可能需要连续回退,必须用 while。
// 适用于 C++17
while (j > 0 && pat[i] != pat[j]) { j = next[j - 1]; }
- ❌ 认为 KMP 一定比
std::string::find快。
// 适用于 C++17
// 对小模式串盲目替换标准库实现✅ 先明确输入规模与最坏情况要求,再决定是否手写;标准库实现通常经过充分优化,且语义(是否重叠)需要自行确认。
总结
| 要点 | 内容 |
|---|
next[i] 定义 | pat[0..i] 的最长相等真前后缀长度 |
| 失配回退 | j = next[j-1],文本指针不回退 |
| 构造复杂度 | O(m),均摊分析依赖 j 的增减 |
| 搜索复杂度 | O(n+m),额外空间 O(m) |
| 重叠匹配 | 命中后 j = next[j-1] |
| 空模式串 | 单独处理,避免越界 |
| 下标类型 | 统一 std::size_t,警惕下溢 |
KMP 的难点不在代码长度,而在把 next 的定义、回退目标和边界条件三者对齐。只要始终问自己「当前 j 表示已匹配多长」,回退到 next[j-1] 就是自然结论,而不是需要死记的规则。
qlb.ghuage.com/17934.sHtML
qlb.ghuage.com/62791.sHtML
qlb.ghuage.com/54779.sHtML
qlb.ghuage.com/48099.sHtML
qlb.ghuage.com/85328.sHtML
qlb.ghuage.com/72015.sHtML
qlb.ghuage.com/32473.sHtML
qlb.ghuage.com/88080.sHtML
qlb.ghuage.com/12791.sHtML
qlb.ghuage.com/70726.sHtML
qlv.ghuage.com/25159.sHtML
qlv.ghuage.com/87591.sHtML
qlv.ghuage.com/04006.sHtML
qlv.ghuage.com/08289.sHtML
qlv.ghuage.com/54774.sHtML
qlv.ghuage.com/53842.sHtML
qlv.ghuage.com/55096.sHtML
qlv.ghuage.com/14951.sHtML
qlv.ghuage.com/35593.sHtML
qlv.ghuage.com/78278.sHtML
qlc.ghuage.com/69595.sHtML
qlc.ghuage.com/32098.sHtML
qlc.ghuage.com/89739.sHtML
qlc.ghuage.com/91081.sHtML
qlc.ghuage.com/24455.sHtML
qlc.ghuage.com/97533.sHtML
qlc.ghuage.com/95339.sHtML
qlc.ghuage.com/95657.sHtML
qlc.ghuage.com/96106.sHtML
qlc.ghuage.com/56396.sHtML
qlx.ghuage.com/16960.sHtML
qlx.ghuage.com/70577.sHtML
qlx.ghuage.com/84779.sHtML
qlx.ghuage.com/68606.sHtML
qlx.ghuage.com/06739.sHtML
qlx.ghuage.com/06904.sHtML
qlx.ghuage.com/60424.sHtML
qlx.ghuage.com/20178.sHtML
qlx.ghuage.com/30662.sHtML
qlx.ghuage.com/47988.sHtML
qlz.ghuage.com/29663.sHtML
qlz.ghuage.com/98359.sHtML
qlz.ghuage.com/16957.sHtML
qlz.ghuage.com/69192.sHtML
qlz.ghuage.com/58447.sHtML
qlz.ghuage.com/01713.sHtML
qlz.ghuage.com/78355.sHtML
qlz.ghuage.com/14387.sHtML
qlz.ghuage.com/92865.sHtML
qlz.ghuage.com/58604.sHtML
qll.ghuage.com/88284.sHtML
qll.ghuage.com/50266.sHtML
qll.ghuage.com/60253.sHtML
qll.ghuage.com/08333.sHtML
qll.ghuage.com/25087.sHtML
qll.ghuage.com/02759.sHtML
qll.ghuage.com/15979.sHtML
qll.ghuage.com/28445.sHtML
qll.ghuage.com/75798.sHtML
qll.ghuage.com/43137.sHtML
qlk.ghuage.com/07468.sHtML
qlk.ghuage.com/81485.sHtML
qlk.ghuage.com/49107.sHtML
qlk.ghuage.com/06440.sHtML
qlk.ghuage.com/14978.sHtML
qlk.ghuage.com/73753.sHtML
qlk.ghuage.com/61377.sHtML
qlk.ghuage.com/53288.sHtML
qlk.ghuage.com/66322.sHtML
qlk.ghuage.com/54444.sHtML
qlj.ghuage.com/69343.sHtML
qlj.ghuage.com/25246.sHtML
qlj.ghuage.com/42642.sHtML
qlj.ghuage.com/28759.sHtML
qlj.ghuage.com/60975.sHtML
qlj.ghuage.com/76406.sHtML
qlj.ghuage.com/20472.sHtML
qlj.ghuage.com/57117.sHtML
qlj.ghuage.com/34873.sHtML
qlj.ghuage.com/05550.sHtML
qlh.ghuage.com/34244.sHtML
qlh.ghuage.com/64084.sHtML
qlh.ghuage.com/35062.sHtML
qlh.ghuage.com/87409.sHtML
qlh.ghuage.com/49319.sHtML
qlh.ghuage.com/35917.sHtML
qlh.ghuage.com/17546.sHtML
qlh.ghuage.com/94721.sHtML
qlh.ghuage.com/29711.sHtML
qlh.ghuage.com/23530.sHtML
qlg.ghuage.com/23086.sHtML
qlg.ghuage.com/74995.sHtML
qlg.ghuage.com/82117.sHtML
qlg.ghuage.com/65418.sHtML
qlg.ghuage.com/67731.sHtML
qlg.ghuage.com/23116.sHtML
qlg.ghuage.com/12068.sHtML
qlg.ghuage.com/77908.sHtML
qlg.ghuage.com/24138.sHtML
qlg.ghuage.com/87073.sHtML
qlf.ghuage.com/30801.sHtML
qlf.ghuage.com/75600.sHtML
qlf.ghuage.com/47911.sHtML
qlf.ghuage.com/01256.sHtML
qlf.ghuage.com/45621.sHtML
qlf.ghuage.com/91043.sHtML
qlf.ghuage.com/84662.sHtML
qlf.ghuage.com/40282.sHtML
qlf.ghuage.com/67236.sHtML
qlf.ghuage.com/31673.sHtML
qld.ghuage.com/68978.sHtML
qld.ghuage.com/85601.sHtML
qld.ghuage.com/34200.sHtML
qld.ghuage.com/07951.sHtML
qld.ghuage.com/66535.sHtML
qld.ghuage.com/10684.sHtML
qld.ghuage.com/50102.sHtML
qld.ghuage.com/51004.sHtML
qld.ghuage.com/52931.sHtML
qld.ghuage.com/29315.sHtML
qls.ghuage.com/13199.sHtML
qls.ghuage.com/98992.sHtML
qls.ghuage.com/30504.sHtML
qls.ghuage.com/40065.sHtML
qls.ghuage.com/69990.sHtML
qls.ghuage.com/53959.sHtML
qls.ghuage.com/40059.sHtML
qls.ghuage.com/88317.sHtML
qls.ghuage.com/90020.sHtML
qls.ghuage.com/74956.sHtML
qla.ghuage.com/57275.sHtML
qla.ghuage.com/71001.sHtML
qla.ghuage.com/06178.sHtML
qla.ghuage.com/96650.sHtML
qla.ghuage.com/32345.sHtML
qla.ghuage.com/13496.sHtML
qla.ghuage.com/50922.sHtML
qla.ghuage.com/89170.sHtML
qla.ghuage.com/02460.sHtML
qla.ghuage.com/91690.sHtML
qlp.ghuage.com/55152.sHtML
qlp.ghuage.com/97540.sHtML
qlp.ghuage.com/35914.sHtML
qlp.ghuage.com/44321.sHtML
qlp.ghuage.com/86959.sHtML
qlp.ghuage.com/10424.sHtML
qlp.ghuage.com/10425.sHtML
qlp.ghuage.com/48570.sHtML
qlp.ghuage.com/64488.sHtML
qlp.ghuage.com/51576.sHtML
qlo.ghuage.com/05688.sHtML
qlo.ghuage.com/81135.sHtML
qlo.ghuage.com/61462.sHtML
qlo.ghuage.com/40244.sHtML
qlo.ghuage.com/67314.sHtML
qlo.ghuage.com/81262.sHtML
qlo.ghuage.com/58177.sHtML
qlo.ghuage.com/52319.sHtML
qlo.ghuage.com/82771.sHtML
qlo.ghuage.com/84396.sHtML
qli.ghuage.com/95046.sHtML
qli.ghuage.com/18778.sHtML
qli.ghuage.com/98619.sHtML
qli.ghuage.com/17779.sHtML
qli.ghuage.com/54172.sHtML
qli.ghuage.com/95482.sHtML
qli.ghuage.com/06459.sHtML
qli.ghuage.com/63793.sHtML
qli.ghuage.com/77431.sHtML
qli.ghuage.com/54396.sHtML
qlu.ghuage.com/56331.sHtML
qlu.ghuage.com/85353.sHtML
qlu.ghuage.com/07384.sHtML
qlu.ghuage.com/69759.sHtML
qlu.ghuage.com/02388.sHtML
qlu.ghuage.com/71777.sHtML
qlu.ghuage.com/50012.sHtML
qlu.ghuage.com/58662.sHtML
qlu.ghuage.com/19318.sHtML
qlu.ghuage.com/51407.sHtML
qly.ghuage.com/76220.sHtML
qly.ghuage.com/10228.sHtML
qly.ghuage.com/97276.sHtML
qly.ghuage.com/87591.sHtML
qly.ghuage.com/87624.sHtML
qly.ghuage.com/09433.sHtML
qly.ghuage.com/49606.sHtML
qly.ghuage.com/99562.sHtML
qly.ghuage.com/82748.sHtML
qly.ghuage.com/42419.sHtML
qlt.ghuage.com/15055.sHtML
qlt.ghuage.com/94420.sHtML
qlt.ghuage.com/99946.sHtML
qlt.ghuage.com/52533.sHtML
qlt.ghuage.com/22166.sHtML
qlt.ghuage.com/40415.sHtML
qlt.ghuage.com/42433.sHtML
qlt.ghuage.com/56464.sHtML
qlt.ghuage.com/07907.sHtML
qlt.ghuage.com/05084.sHtML
qlr.ghuage.com/62168.sHtML
qlr.ghuage.com/90378.sHtML
qlr.ghuage.com/07204.sHtML
qlr.ghuage.com/37848.sHtML
qlr.ghuage.com/90707.sHtML
qlr.ghuage.com/53611.sHtML
qlr.ghuage.com/77571.sHtML
qlr.ghuage.com/06260.sHtML
qlr.ghuage.com/21795.sHtML
qlr.ghuage.com/12584.sHtML
qle.ghuage.com/39190.sHtML
qle.ghuage.com/33129.sHtML
qle.ghuage.com/75353.sHtML
qle.ghuage.com/64217.sHtML
qle.ghuage.com/87862.sHtML
qle.ghuage.com/92130.sHtML
qle.ghuage.com/67262.sHtML
qle.ghuage.com/79000.sHtML
qle.ghuage.com/23731.sHtML
qle.ghuage.com/64111.sHtML
qlw.ghuage.com/24236.sHtML
qlw.ghuage.com/60351.sHtML
qlw.ghuage.com/90100.sHtML
qlw.ghuage.com/48432.sHtML
qlw.ghuage.com/64569.sHtML
qlw.ghuage.com/22379.sHtML
qlw.ghuage.com/57626.sHtML
qlw.ghuage.com/96646.sHtML
qlw.ghuage.com/14002.sHtML
qlw.ghuage.com/89399.sHtML
qlq.ghuage.com/58337.sHtML
qlq.ghuage.com/94550.sHtML
qlq.ghuage.com/09739.sHtML
qlq.ghuage.com/75906.sHtML
qlq.ghuage.com/64342.sHtML
qlq.ghuage.com/88226.sHtML
qlq.ghuage.com/19724.sHtML
qlq.ghuage.com/24602.sHtML
qlq.ghuage.com/73104.sHtML
qlq.ghuage.com/15330.sHtML
qkm.ghuage.com/21709.sHtML
qkm.ghuage.com/46226.sHtML
qkm.ghuage.com/41539.sHtML
qkm.ghuage.com/95815.sHtML
qkm.ghuage.com/25906.sHtML
qkm.ghuage.com/08883.sHtML
qkm.ghuage.com/96637.sHtML
qkm.ghuage.com/06118.sHtML
qkm.ghuage.com/35628.sHtML
qkm.ghuage.com/00631.sHtML
qkn.ghuage.com/97225.sHtML
qkn.ghuage.com/26517.sHtML
qkn.ghuage.com/35068.sHtML
qkn.ghuage.com/10423.sHtML
qkn.ghuage.com/56955.sHtML
qkn.ghuage.com/81683.sHtML
qkn.ghuage.com/16571.sHtML
qkn.ghuage.com/89713.sHtML
qkn.ghuage.com/01179.sHtML
qkn.ghuage.com/21002.sHtML
qkb.ghuage.com/86873.sHtML
qkb.ghuage.com/98482.sHtML
qkb.ghuage.com/48209.sHtML
qkb.ghuage.com/61695.sHtML
qkb.ghuage.com/77400.sHtML
qkb.ghuage.com/68847.sHtML
qkb.ghuage.com/65472.sHtML
qkb.ghuage.com/15133.sHtML
qkb.ghuage.com/06623.sHtML
qkb.ghuage.com/85517.sHtML
qkv.ghuage.com/51248.sHtML
qkv.ghuage.com/70542.sHtML
qkv.ghuage.com/46715.sHtML
qkv.ghuage.com/56933.sHtML
qkv.ghuage.com/18913.sHtML
qkv.ghuage.com/98099.sHtML
qkv.ghuage.com/44021.sHtML
qkv.ghuage.com/11380.sHtML
qkv.ghuage.com/75533.sHtML
qkv.ghuage.com/50795.sHtML
qkc.ghuage.com/95737.sHtML
qkc.ghuage.com/54908.sHtML
qkc.ghuage.com/19229.sHtML
qkc.ghuage.com/82947.sHtML
qkc.ghuage.com/51446.sHtML
qkc.ghuage.com/26024.sHtML
qkc.ghuage.com/60262.sHtML
qkc.ghuage.com/42970.sHtML
qkc.ghuage.com/91320.sHtML
qkc.ghuage.com/31768.sHtML
qkx.ghuage.com/49436.sHtML
qkx.ghuage.com/02533.sHtML
qkx.ghuage.com/49722.sHtML
qkx.ghuage.com/39111.sHtML
qkx.ghuage.com/12055.sHtML
qkx.ghuage.com/66242.sHtML
qkx.ghuage.com/96808.sHtML
qkx.ghuage.com/80306.sHtML
qkx.ghuage.com/98286.sHtML
qkx.ghuage.com/06795.sHtML
qkz.ghuage.com/45785.sHtML
qkz.ghuage.com/60109.sHtML
qkz.ghuage.com/00974.sHtML
qkz.ghuage.com/94426.sHtML
qkz.ghuage.com/05975.sHtML
qkz.ghuage.com/70535.sHtML
qkz.ghuage.com/78569.sHtML
qkz.ghuage.com/34951.sHtML
qkz.ghuage.com/33800.sHtML
qkz.ghuage.com/77370.sHtML
qkl.ghuage.com/29183.sHtML
qkl.ghuage.com/56845.sHtML
qkl.ghuage.com/22060.sHtML
qkl.ghuage.com/30046.sHtML
qkl.ghuage.com/48624.sHtML
qkl.ghuage.com/93128.sHtML
qkl.ghuage.com/05917.sHtML
qkl.ghuage.com/54591.sHtML
qkl.ghuage.com/05086.sHtML
qkl.ghuage.com/09575.sHtML
qkk.ghuage.com/85866.sHtML
qkk.ghuage.com/36302.sHtML
qkk.ghuage.com/80774.sHtML
qkk.ghuage.com/94804.sHtML
qkk.ghuage.com/60766.sHtML
qkk.ghuage.com/30728.sHtML
qkk.ghuage.com/59976.sHtML
qkk.ghuage.com/92636.sHtML
qkk.ghuage.com/65074.sHtML
qkk.ghuage.com/94735.sHtML
qkj.ghuage.com/44536.sHtML
qkj.ghuage.com/26937.sHtML
qkj.ghuage.com/91825.sHtML
qkj.ghuage.com/97468.sHtML
qkj.ghuage.com/47303.sHtML
qkj.ghuage.com/33591.sHtML
qkj.ghuage.com/14813.sHtML
qkj.ghuage.com/95559.sHtML
qkj.ghuage.com/95939.sHtML
qkj.ghuage.com/66391.sHtML
qkh.ghuage.com/24477.sHtML
qkh.ghuage.com/93595.sHtML
qkh.ghuage.com/97582.sHtML
qkh.ghuage.com/86971.sHtML
qkh.ghuage.com/45797.sHtML
qkh.ghuage.com/73758.sHtML
qkh.ghuage.com/77241.sHtML
qkh.ghuage.com/07523.sHtML
qkh.ghuage.com/36937.sHtML
qkh.ghuage.com/60710.sHtML
qkg.ghuage.com/55428.sHtML
qkg.ghuage.com/99647.sHtML
qkg.ghuage.com/77495.sHtML
qkg.ghuage.com/71858.sHtML
qkg.ghuage.com/97839.sHtML
qkg.ghuage.com/43935.sHtML
qkg.ghuage.com/58048.sHtML
qkg.ghuage.com/65057.sHtML
qkg.ghuage.com/45603.sHtML
qkg.ghuage.com/82308.sHtML
qkf.ghuage.com/64334.sHtML
qkf.ghuage.com/28914.sHtML
qkf.ghuage.com/45168.sHtML
qkf.ghuage.com/81151.sHtML
qkf.ghuage.com/06413.sHtML
qkf.ghuage.com/25284.sHtML
qkf.ghuage.com/35244.sHtML
qkf.ghuage.com/46972.sHtML
qkf.ghuage.com/30510.sHtML
qkf.ghuage.com/73046.sHtML
qkd.ghuage.com/64660.sHtML
qkd.ghuage.com/75640.sHtML
qkd.ghuage.com/55959.sHtML
qkd.ghuage.com/06519.sHtML
qkd.ghuage.com/81788.sHtML
qkd.ghuage.com/33595.sHtML
qkd.ghuage.com/37004.sHtML
qkd.ghuage.com/49371.sHtML
qkd.ghuage.com/83612.sHtML
qkd.ghuage.com/74540.sHtML
qks.ghuage.com/59595.sHtML
qks.ghuage.com/56989.sHtML
qks.ghuage.com/95824.sHtML
qks.ghuage.com/71252.sHtML
qks.ghuage.com/25932.sHtML
qks.ghuage.com/82573.sHtML
qks.ghuage.com/96812.sHtML
qks.ghuage.com/82578.sHtML
qks.ghuage.com/54642.sHtML
qks.ghuage.com/57971.sHtML
qka.ghuage.com/90263.sHtML
qka.ghuage.com/98730.sHtML
qka.ghuage.com/91370.sHtML
qka.ghuage.com/60786.sHtML
qka.ghuage.com/27233.sHtML
qka.ghuage.com/28999.sHtML
qka.ghuage.com/56891.sHtML
qka.ghuage.com/92936.sHtML
qka.ghuage.com/83727.sHtML
qka.ghuage.com/73599.sHtML
qkp.ghuage.com/32127.sHtML
qkp.ghuage.com/16554.sHtML
qkp.ghuage.com/15736.sHtML
qkp.ghuage.com/73064.sHtML
qkp.ghuage.com/91209.sHtML
qkp.ghuage.com/27846.sHtML
qkp.ghuage.com/83095.sHtML
qkp.ghuage.com/95173.sHtML
qkp.ghuage.com/96396.sHtML
qkp.ghuage.com/27870.sHtML
qko.ghuage.com/43661.sHtML
qko.ghuage.com/04315.sHtML
qko.ghuage.com/11719.sHtML
qko.ghuage.com/31021.sHtML
qko.ghuage.com/57979.sHtML
qko.ghuage.com/37859.sHtML
qko.ghuage.com/22407.sHtML
qko.ghuage.com/19860.sHtML
qko.ghuage.com/60182.sHtML
qko.ghuage.com/72419.sHtML
qki.ghuage.com/90758.sHtML
qki.ghuage.com/03679.sHtML
qki.ghuage.com/31952.sHtML
qki.ghuage.com/18355.sHtML
qki.ghuage.com/03977.sHtML
qki.ghuage.com/19607.sHtML
qki.ghuage.com/15821.sHtML
qki.ghuage.com/65175.sHtML
qki.ghuage.com/36931.sHtML
qki.ghuage.com/80806.sHtML
qku.ghuage.com/99335.sHtML
qku.ghuage.com/10726.sHtML
qku.ghuage.com/00497.sHtML
qku.ghuage.com/15219.sHtML
qku.ghuage.com/98098.sHtML
qku.ghuage.com/69107.sHtML
qku.ghuage.com/47201.sHtML
qku.ghuage.com/52598.sHtML
qku.ghuage.com/43526.sHtML
qku.ghuage.com/55003.sHtML
qky.ghuage.com/10779.sHtML
qky.ghuage.com/66906.sHtML
qky.ghuage.com/92756.sHtML
qky.ghuage.com/60282.sHtML
qky.ghuage.com/51796.sHtML
qky.ghuage.com/60219.sHtML
qky.ghuage.com/67015.sHtML
qky.ghuage.com/10706.sHtML
qky.ghuage.com/89420.sHtML
qky.ghuage.com/87933.sHtML
qkt.ghuage.com/78076.sHtML
qkt.ghuage.com/85824.sHtML
qkt.ghuage.com/98799.sHtML
qkt.ghuage.com/50886.sHtML
qkt.ghuage.com/61244.sHtML
qkt.ghuage.com/65971.sHtML
qkt.ghuage.com/99575.sHtML
qkt.ghuage.com/74558.sHtML
qkt.ghuage.com/96922.sHtML
qkt.ghuage.com/57977.sHtML
qkr.ghuage.com/41062.sHtML
qkr.ghuage.com/60511.sHtML
qkr.ghuage.com/56640.sHtML
qkr.ghuage.com/48355.sHtML
qkr.ghuage.com/09234.sHtML
qkr.ghuage.com/46027.sHtML
qkr.ghuage.com/75515.sHtML
qkr.ghuage.com/30376.sHtML
qkr.ghuage.com/63857.sHtML
qkr.ghuage.com/85759.sHtML
qke.ghuage.com/40386.sHtML
qke.ghuage.com/84823.sHtML
qke.ghuage.com/01469.sHtML
qke.ghuage.com/95053.sHtML
qke.ghuage.com/20310.sHtML
qke.ghuage.com/09956.sHtML
qke.ghuage.com/36989.sHtML
qke.ghuage.com/20139.sHtML
qke.ghuage.com/85853.sHtML
qke.ghuage.com/60553.sHtML
qkw.ghuage.com/79982.sHtML
qkw.ghuage.com/41400.sHtML
qkw.ghuage.com/05697.sHtML
qkw.ghuage.com/17990.sHtML
qkw.ghuage.com/02975.sHtML
qkw.ghuage.com/37277.sHtML
qkw.ghuage.com/26445.sHtML
qkw.ghuage.com/71622.sHtML
qkw.ghuage.com/09301.sHtML
qkw.ghuage.com/85940.sHtML
qkq.ghuage.com/91296.sHtML
qkq.ghuage.com/94197.sHtML
qkq.ghuage.com/64445.sHtML
qkq.ghuage.com/24255.sHtML
qkq.ghuage.com/04909.sHtML
qkq.ghuage.com/91551.sHtML
qkq.ghuage.com/98952.sHtML
qkq.ghuage.com/25440.sHtML
qkq.ghuage.com/74686.sHtML
qkq.ghuage.com/57513.sHtML
qjm.ghuage.com/77688.sHtML
qjm.ghuage.com/10204.sHtML
qjm.ghuage.com/06956.sHtML
qjm.ghuage.com/84311.sHtML
qjm.ghuage.com/53025.sHtML
qjm.ghuage.com/15204.sHtML
qjm.ghuage.com/30202.sHtML
qjm.ghuage.com/54726.sHtML
qjm.ghuage.com/43827.sHtML
qjm.ghuage.com/37598.sHtML
qjn.ghuage.com/32043.sHtML
qjn.ghuage.com/96107.sHtML
qjn.ghuage.com/27102.sHtML
qjn.ghuage.com/96329.sHtML
qjn.ghuage.com/70064.sHtML
qjn.ghuage.com/38464.sHtML
qjn.ghuage.com/94837.sHtML
qjn.ghuage.com/42546.sHtML
qjn.ghuage.com/35719.sHtML
qjn.ghuage.com/15346.sHtML
qjb.ghuage.com/08419.sHtML
qjb.ghuage.com/29927.sHtML
qjb.ghuage.com/70606.sHtML
qjb.ghuage.com/82633.sHtML
qjb.ghuage.com/37080.sHtML
qjb.ghuage.com/66071.sHtML
qjb.ghuage.com/64776.sHtML
qjb.ghuage.com/92680.sHtML
qjb.ghuage.com/71480.sHtML
qjb.ghuage.com/96498.sHtML
qjv.ghuage.com/55260.sHtML
qjv.ghuage.com/05682.sHtML
qjv.ghuage.com/49959.sHtML
qjv.ghuage.com/42057.sHtML
qjv.ghuage.com/34550.sHtML
qjv.ghuage.com/29224.sHtML
qjv.ghuage.com/42775.sHtML
qjv.ghuage.com/58235.sHtML
qjv.ghuage.com/58354.sHtML
qjv.ghuage.com/33428.sHtML
qjc.ghuage.com/06080.sHtML
qjc.ghuage.com/96646.sHtML
qjc.ghuage.com/27448.sHtML
qjc.ghuage.com/69168.sHtML
qjc.ghuage.com/17904.sHtML
qjc.ghuage.com/32443.sHtML
qjc.ghuage.com/79088.sHtML
qjc.ghuage.com/09713.sHtML
qjc.ghuage.com/59359.sHtML
qjc.ghuage.com/45000.sHtML
qjx.ghuage.com/76304.sHtML
qjx.ghuage.com/94532.sHtML
qjx.ghuage.com/76110.sHtML
qjx.ghuage.com/69319.sHtML
qjx.ghuage.com/42677.sHtML
qjx.ghuage.com/83480.sHtML
qjx.ghuage.com/24461.sHtML
qjx.ghuage.com/22820.sHtML
qjx.ghuage.com/39789.sHtML
qjx.ghuage.com/05115.sHtML
qjz.ghuage.com/47828.sHtML
qjz.ghuage.com/24759.sHtML
qjz.ghuage.com/28394.sHtML
qjz.ghuage.com/45315.sHtML
qjz.ghuage.com/42496.sHtML
qjz.ghuage.com/78567.sHtML
qjz.ghuage.com/79788.sHtML
qjz.ghuage.com/36415.sHtML
qjz.ghuage.com/49929.sHtML
qjz.ghuage.com/53517.sHtML
qjl.ghuage.com/85359.sHtML
qjl.ghuage.com/92064.sHtML
qjl.ghuage.com/26433.sHtML
qjl.ghuage.com/87347.sHtML
qjl.ghuage.com/48001.sHtML
qjl.ghuage.com/36783.sHtML
qjl.ghuage.com/79170.sHtML
qjl.ghuage.com/14694.sHtML
qjl.ghuage.com/98747.sHtML
qjl.ghuage.com/80382.sHtML
qjk.ghuage.com/14959.sHtML
qjk.ghuage.com/53203.sHtML
qjk.ghuage.com/23577.sHtML
qjk.ghuage.com/34021.sHtML
qjk.ghuage.com/47775.sHtML
qjk.ghuage.com/06811.sHtML
qjk.ghuage.com/34104.sHtML
qjk.ghuage.com/79131.sHtML
qjk.ghuage.com/96393.sHtML
qjk.ghuage.com/20552.sHtML
qjj.ghuage.com/64997.sHtML
qjj.ghuage.com/96846.sHtML
qjj.ghuage.com/40880.sHtML
qjj.ghuage.com/04848.sHtML
qjj.ghuage.com/40445.sHtML
qjj.ghuage.com/00289.sHtML
qjj.ghuage.com/03974.sHtML
qjj.ghuage.com/11713.sHtML
qjj.ghuage.com/43528.sHtML
qjj.ghuage.com/44685.sHtML
qjh.ghuage.com/99795.sHtML
qjh.ghuage.com/48330.sHtML
qjh.ghuage.com/09378.sHtML
qjh.ghuage.com/71311.sHtML
qjh.ghuage.com/39734.sHtML
qjh.ghuage.com/07042.sHtML
qjh.ghuage.com/46288.sHtML
qjh.ghuage.com/24329.sHtML
qjh.ghuage.com/37511.sHtML
qjh.ghuage.com/08808.sHtML
qjg.ghuage.com/15135.sHtML
qjg.ghuage.com/25554.sHtML
qjg.ghuage.com/48455.sHtML
qjg.ghuage.com/73596.sHtML
qjg.ghuage.com/13665.sHtML
qjg.ghuage.com/90220.sHtML
qjg.ghuage.com/46366.sHtML
qjg.ghuage.com/46137.sHtML
qjg.ghuage.com/21899.sHtML
qjg.ghuage.com/04604.sHtML
qjf.ghuage.com/81519.sHtML
qjf.ghuage.com/24203.sHtML
qjf.ghuage.com/78197.sHtML
qjf.ghuage.com/64653.sHtML
qjf.ghuage.com/53950.sHtML
qjf.ghuage.com/51713.sHtML
qjf.ghuage.com/06199.sHtML
qjf.ghuage.com/71396.sHtML
qjf.ghuage.com/96248.sHtML
qjf.ghuage.com/44626.sHtML
qjd.ghuage.com/77303.sHtML
qjd.ghuage.com/75700.sHtML
qjd.ghuage.com/22823.sHtML
qjd.ghuage.com/20562.sHtML
qjd.ghuage.com/48178.sHtML
qjd.ghuage.com/48051.sHtML
qjd.ghuage.com/23848.sHtML
qjd.ghuage.com/50891.sHtML
qjd.ghuage.com/75885.sHtML
qjd.ghuage.com/45426.sHtML
qjs.ghuage.com/85652.sHtML
qjs.ghuage.com/03154.sHtML
qjs.ghuage.com/66229.sHtML
qjs.ghuage.com/06717.sHtML
qjs.ghuage.com/38226.sHtML
qjs.ghuage.com/93283.sHtML
qjs.ghuage.com/77546.sHtML
qjs.ghuage.com/02460.sHtML
qjs.ghuage.com/22395.sHtML
qjs.ghuage.com/47542.sHtML
qja.ghuage.com/41114.sHtML
qja.ghuage.com/95292.sHtML
qja.ghuage.com/14828.sHtML
qja.ghuage.com/43486.sHtML
qja.ghuage.com/74952.sHtML
qja.ghuage.com/26447.sHtML
qja.ghuage.com/84413.sHtML
qja.ghuage.com/10554.sHtML
qja.ghuage.com/77717.sHtML
qja.ghuage.com/84091.sHtML
qjp.ghuage.com/68913.sHtML
qjp.ghuage.com/37511.sHtML
qjp.ghuage.com/44402.sHtML
qjp.ghuage.com/95517.sHtML
qjp.ghuage.com/79591.sHtML
qjp.ghuage.com/03286.sHtML
qjp.ghuage.com/62591.sHtML
qjp.ghuage.com/98719.sHtML
qjp.ghuage.com/30322.sHtML
qjp.ghuage.com/07113.sHtML
qjo.ghuage.com/61375.sHtML
qjo.ghuage.com/32091.sHtML
qjo.ghuage.com/97799.sHtML
qjo.ghuage.com/89013.sHtML
qjo.ghuage.com/42990.sHtML
qjo.ghuage.com/73546.sHtML
qjo.ghuage.com/58773.sHtML
qjo.ghuage.com/33442.sHtML
qjo.ghuage.com/76466.sHtML
qjo.ghuage.com/73098.sHtML
qji.ghuage.com/05864.sHtML
qji.ghuage.com/12733.sHtML
qji.ghuage.com/72257.sHtML
qji.ghuage.com/31659.sHtML
qji.ghuage.com/47824.sHtML
qji.ghuage.com/59317.sHtML
qji.ghuage.com/36488.sHtML
qji.ghuage.com/29780.sHtML
qji.ghuage.com/07550.sHtML
qji.ghuage.com/44662.sHtML
qju.ghuage.com/01840.sHtML
qju.ghuage.com/37171.sHtML
qju.ghuage.com/87313.sHtML
qju.ghuage.com/71680.sHtML
qju.ghuage.com/26503.sHtML
qju.ghuage.com/33114.sHtML
qju.ghuage.com/63888.sHtML
qju.ghuage.com/96066.sHtML
qju.ghuage.com/73198.sHtML
qju.ghuage.com/76077.sHtML
qjy.ghuage.com/86959.sHtML
qjy.ghuage.com/93913.sHtML
qjy.ghuage.com/50573.sHtML
qjy.ghuage.com/87618.sHtML
qjy.ghuage.com/64645.sHtML
qjy.ghuage.com/70054.sHtML
qjy.ghuage.com/37184.sHtML
qjy.ghuage.com/61915.sHtML
qjy.ghuage.com/36686.sHtML
qjy.ghuage.com/99533.sHtML
qjt.ghuage.com/55957.sHtML
qjt.ghuage.com/86884.sHtML
qjt.ghuage.com/23410.sHtML
qjt.ghuage.com/71400.sHtML
qjt.ghuage.com/43139.sHtML
qjt.ghuage.com/87955.sHtML
qjt.ghuage.com/23353.sHtML
qjt.ghuage.com/86799.sHtML
qjt.ghuage.com/64608.sHtML
qjt.ghuage.com/24887.sHtML
qjr.ghuage.com/99195.sHtML
qjr.ghuage.com/22316.sHtML
qjr.ghuage.com/59633.sHtML
qjr.ghuage.com/42913.sHtML
qjr.ghuage.com/32361.sHtML
qjr.ghuage.com/67197.sHtML
qjr.ghuage.com/45720.sHtML
qjr.ghuage.com/87088.sHtML
qjr.ghuage.com/83253.sHtML
qjr.ghuage.com/24735.sHtML
qje.ghuage.com/45953.sHtML
qje.ghuage.com/76802.sHtML
qje.ghuage.com/29448.sHtML
qje.ghuage.com/97976.sHtML
qje.ghuage.com/30406.sHtML
qje.ghuage.com/94499.sHtML
qje.ghuage.com/73665.sHtML
qje.ghuage.com/76350.sHtML
qje.ghuage.com/45130.sHtML
qje.ghuage.com/98313.sHtML
qjw.ghuage.com/71995.sHtML
qjw.ghuage.com/62666.sHtML
qjw.ghuage.com/70832.sHtML
qjw.ghuage.com/44624.sHtML
qjw.ghuage.com/65697.sHtML
qjw.ghuage.com/06508.sHtML
qjw.ghuage.com/21225.sHtML
qjw.ghuage.com/78539.sHtML
qjw.ghuage.com/08877.sHtML
qjw.ghuage.com/85492.sHtML
qjq.ghuage.com/48590.sHtML
qjq.ghuage.com/46711.sHtML
qjq.ghuage.com/87931.sHtML
qjq.ghuage.com/52533.sHtML
qjq.ghuage.com/35452.sHtML
qjq.ghuage.com/71579.sHtML
qjq.ghuage.com/38747.sHtML
qjq.ghuage.com/94199.sHtML
qjq.ghuage.com/57742.sHtML
qjq.ghuage.com/90459.sHtML
qhm.ghuage.com/13413.sHtML
qhm.ghuage.com/30319.sHtML
qhm.ghuage.com/91696.sHtML
qhm.ghuage.com/10361.sHtML
qhm.ghuage.com/88759.sHtML
qhm.ghuage.com/18539.sHtML
qhm.ghuage.com/86332.sHtML
qhm.ghuage.com/93645.sHtML
qhm.ghuage.com/21064.sHtML
qhm.ghuage.com/42757.sHtML
qhn.ghuage.com/00422.sHtML
qhn.ghuage.com/60771.sHtML
qhn.ghuage.com/45042.sHtML
qhn.ghuage.com/26650.sHtML
qhn.ghuage.com/07577.sHtML
qhn.ghuage.com/58153.sHtML
qhn.ghuage.com/84940.sHtML
qhn.ghuage.com/58552.sHtML
qhn.ghuage.com/40999.sHtML
qhn.ghuage.com/32479.sHtML
qhb.ghuage.com/88173.sHtML
qhb.ghuage.com/13362.sHtML
qhb.ghuage.com/20091.sHtML
qhb.ghuage.com/92591.sHtML
qhb.ghuage.com/69113.sHtML
qhb.ghuage.com/20175.sHtML
qhb.ghuage.com/56051.sHtML
qhb.ghuage.com/17186.sHtML
qhb.ghuage.com/24804.sHtML
qhb.ghuage.com/71627.sHtML
qhv.ghuage.com/07631.sHtML
qhv.ghuage.com/84428.sHtML
qhv.ghuage.com/94628.sHtML
qhv.ghuage.com/97785.sHtML
qhv.ghuage.com/28585.sHtML
qhv.ghuage.com/15795.sHtML
qhv.ghuage.com/07553.sHtML
qhv.ghuage.com/38044.sHtML
qhv.ghuage.com/49647.sHtML
qhv.ghuage.com/34053.sHtML
qhc.ghuage.com/87635.sHtML
qhc.ghuage.com/16226.sHtML
qhc.ghuage.com/27661.sHtML
qhc.ghuage.com/93106.sHtML
qhc.ghuage.com/58613.sHtML
qhc.ghuage.com/51198.sHtML
qhc.ghuage.com/98917.sHtML
qhc.ghuage.com/08057.sHtML
qhc.ghuage.com/13652.sHtML
qhc.ghuage.com/67663.sHtML
qhx.ghuage.com/98825.sHtML
qhx.ghuage.com/24026.sHtML
qhx.ghuage.com/45482.sHtML
qhx.ghuage.com/30315.sHtML
qhx.ghuage.com/45175.sHtML
qhx.ghuage.com/87646.sHtML
qhx.ghuage.com/87460.sHtML
qhx.ghuage.com/13802.sHtML
qhx.ghuage.com/66124.sHtML
qhx.ghuage.com/15319.sHtML
qhz.ghuage.com/36422.sHtML
qhz.ghuage.com/24005.sHtML
qhz.ghuage.com/08825.sHtML
qhz.ghuage.com/73822.sHtML
qhz.ghuage.com/14966.sHtML
qhz.ghuage.com/66290.sHtML
qhz.ghuage.com/35579.sHtML
qhz.ghuage.com/73759.sHtML
qhz.ghuage.com/46889.sHtML
qhz.ghuage.com/50506.sHtML
qhl.ghuage.com/77759.sHtML
qhl.ghuage.com/09868.sHtML
qhl.ghuage.com/50894.sHtML
qhl.ghuage.com/91134.sHtML
qhl.ghuage.com/76366.sHtML
qhl.ghuage.com/54001.sHtML
qhl.ghuage.com/13139.sHtML
qhl.ghuage.com/73935.sHtML
qhl.ghuage.com/90587.sHtML
qhl.ghuage.com/36351.sHtML
qhk.ghuage.com/13191.sHtML
qhk.ghuage.com/28093.sHtML
qhk.ghuage.com/38542.sHtML
qhk.ghuage.com/25004.sHtML
qhk.ghuage.com/00747.sHtML
qhk.ghuage.com/95494.sHtML
qhk.ghuage.com/25268.sHtML
qhk.ghuage.com/50555.sHtML
qhk.ghuage.com/91488.sHtML
qhk.ghuage.com/24668.sHtML
qhj.ghuage.com/64311.sHtML
qhj.ghuage.com/34020.sHtML
qhj.ghuage.com/62066.sHtML
qhj.ghuage.com/86126.sHtML
qhj.ghuage.com/35731.sHtML
qhj.ghuage.com/12844.sHtML
qhj.ghuage.com/96868.sHtML
qhj.ghuage.com/21805.sHtML
qhj.ghuage.com/98128.sHtML
qhj.ghuage.com/68987.sHtML
qhh.ghuage.com/81998.sHtML
qhh.ghuage.com/30887.sHtML
qhh.ghuage.com/30173.sHtML
qhh.ghuage.com/58793.sHtML
qhh.ghuage.com/10954.sHtML
qhh.ghuage.com/57082.sHtML
qhh.ghuage.com/58116.sHtML
qhh.ghuage.com/72848.sHtML
qhh.ghuage.com/00751.sHtML
qhh.ghuage.com/00066.sHtML
qhg.ghuage.com/89015.sHtML
qhg.ghuage.com/18644.sHtML
qhg.ghuage.com/37447.sHtML
qhg.ghuage.com/54080.sHtML
qhg.ghuage.com/49915.sHtML
qhg.ghuage.com/11377.sHtML
qhg.ghuage.com/29427.sHtML
qhg.ghuage.com/75937.sHtML
qhg.ghuage.com/62153.sHtML
qhg.ghuage.com/50364.sHtML
qhf.ghuage.com/96808.sHtML
qhf.ghuage.com/29842.sHtML
qhf.ghuage.com/36464.sHtML
qhf.ghuage.com/87005.sHtML
qhf.ghuage.com/30404.sHtML
qhf.ghuage.com/09126.sHtML
qhf.ghuage.com/23108.sHtML
qhf.ghuage.com/78900.sHtML
qhf.ghuage.com/83009.sHtML
qhf.ghuage.com/34039.sHtML
更多推荐




所有评论(0)