kmp
// idx代表已经匹配到的位置
void get_next(string &p) {
to = vector<int>(n, -1);
to.clear();
int idx = -1;
for (int i = 1; i < n; ++i) {
while(idx != -1 && p[idx + 1] != p[i])
idx = to[idx];
to[i] = p[idx + 1] == p[i] ? ++idx : -1;
}
}
// 这里是返回从p的开头匹配到s的结尾的字符串
// idx代表已经匹配到的位置
string kmp(string& s, string& p) {
int idx = -1;
for (int i = 0; i < n; ++i) {
while(idx != -1 && s[i] != p[idx + 1])
idx = to[idx];
if (s[i] == p[idx + 1]) idx++;
}
return s + p.substr(idx + 1);
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步