[每日一题2020.06.12]P3375 【模板】KMP字符串匹配
2024-09-07 03:21:05
关于kmp : https://www.cnblogs.com/roccoshi/p/13096988.html
关于kmp, 想了很久, 我觉得不应该放在这里写, 另开一贴记录一下.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> getnext(string s) {
vector<int> next;
next.push_back(-1);
int i = 0, j = -1;
while(i < s.size()) {
if(s[i] == s[j] || j==-1) {
i++;
j++;
next.push_back(j);
}
else {
j = next[j];
}
}
return next;
}
vector<int> kmp(string s1, string s2) { // kmp : 找出s2在s1中出现的位置(全部)
vector<int> next = getnext(s2);
vector<int> ans;
int i = 0, j = 0; // i指s1, j指s2
while(i < s1.size()) {
if(s1[i] == s2[j] || j==-1) {
if(j == s2.size()-1) {
ans.push_back(i - j);
j = next[j];
}
else {
i++;
j++;
}
}
else {
j = next[j];
}
}
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
string s;
string s1;
cin >> s >> s1;
vector<int> ans = kmp(s,s1);
vector<int> next = getnext(s1);
for (int i = 0; i < ans.size(); ++i) {
cout << ans[i] + 1 << endl;
}
for (int i = 1; i < next.size(); ++i)
{
cout << next[i] << " ";
}
return 0;
}
最新文章
- mysql常用函数
- LoadRunner 常用C语言函数使用
- windows2003批量添加和导出所有ip
- 编译mahout0.9
- 有关collection中的一些数据结构
- ASP.NET Core和ASP.NET Framework共享Identity身份验证
- VS插件 热
- HTML&;CSS基础学习笔记1.2-HTML的全局属性?
- Selenium1工作原理
- motor和servo
- 获取客户端登录ip地址
- vs2015第二次装安装不能选择路径问题解决方法
- springboot-mybatis多数据源以及踩坑之旅
- 新装 Win7 系统装完驱动精灵,一打开到检测界面就卡死——原因与解决方案
- Windows核心编程:第11章 Windows线程池
- Linux每日小技巧---ss命令
- Aqua Data Studio 数据库开发工具
- Oracle 11g DRCP连接方式——基本原理
- YAML语法介绍
- LeetCode 44 Wildcard Matching(字符串匹配问题)
热门文章
- Mac打不开inkscape怎么办
- kubeadm 搭建kubernetes集群环境
- Kubernetes Ingress简单入门
- 解决ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)
- 前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作用域链与闭包
- 5.Linux的启动过程和系统指令
- 【Ubuntu】Ubuntu18.04通过重装系统成功安装显卡驱动
- 才华能力出众的ReentrantLock
- [Python基础]008.异常
- Weblogic 漏洞利用总结