KMP字符串匹配 模板 洛谷 P3375
2024-08-30 12:16:34
KMP字符串匹配 模板 洛谷 P3375
题意
如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。
为了减少骗分的情况,接下来还要输出子串的前缀数组next。(如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。)
样例:
输入
ABABABC
ABA
输出
1
3
0 0 1
解题思路
当然是使用KMP啦,只不过这个要求比较高一些。
注意这里要输出的next数组内容是不能进行优化的那种,否者就会WA,带有优化的可以看第一个代码。
详情见代码。这个也可以算作一个模板了。
代码实现
//这个是对next进行的优化
void getnext() //做的第一步是获得next【】的值
{
int i=0,k=-1;
next[0]=-1;
while(i<lenb)
{
if(k==-1)//这里和平常的有些不同,这里进行了一些优化,将两个条件分开了。
{
next[++i]=++k;
continue;
}
if (b[i]==b[k])
{
if(b[i+1]==b[k+1]) //这里进行了优化,一般介绍KMP的文章中都有会这个。
next[++i]=next[++k];
else
next[++i]=++k;
}
else k=next[k];
}
}
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e6+7;
char a[maxn],b[maxn];
int next[maxn];
int lena, lenb;
void getnext() //做的第一步是获得next【】的值
{
int i=0,k=-1;
next[0]=-1;
while(i<lenb)
{
if (k==-1 || b[i]==b[k])
next[++i]=++k;
else k=next[k];
}
}
void KMP()
{
getnext();
int i=0,j=0,cnt=0;
while (i<lena)
{
if (j==-1||a[i]==b[j])
{
i++;j++;
}
else j=next[j];
if (j==lenb)
{
printf("%d\n", i-j+1);
j=next[j];
}
}
}
int main()
{
while(scanf("%s",a)!=EOF)
{
scanf("%s",b);
lena=strlen(a);
lenb=strlen(b);
KMP();
for(int i=1; i<=lenb; i++)
{
printf("%d ", next[i]);
}
printf("\n");
}
return 0;
}
最新文章
- Python—模块
- 浅析Hadoop文件格式
- SoapUI中Groovy的实用方法
- 获取https证书
- SQL分组查询GroupBy
- Android控件拖动的实现
- 个人作业3——个人总结(Alpha阶段)
- 搭建第一个spring boot项目
- python之函数用法isupper()
- linux 系统安装配置 zabbix服务(源码安装)
- Find–atime –ctime –mtime的用法与区别总结
- selenium -- 鼠标悬停
- 选择排序(直接排序)java语言实现
- MVC实现多选下拉框,保存并显示多选项
- Dapper 中使用sql in 关键字查询
- ORA-12899: value too large for column
- exynos4412—UART裸板复习
- python基础之迭代器协议和生成器(二)
- Android 画廊效果之ViewPager显示多个图片
- GuozhongCrawler系列教程 (2) CrawTaskBuilder具体解释
热门文章
- Node.js之querystring模块
- 设置HTML的TextArea标记跟随文本内容自动设置高度
- Comet OJ - Contest #14题解
- html b标签 语法
- tomcat8 的优化
- C和C++中的副本机制
- 金蝶K3 WISE 13.1版本服务器虚拟机环境部署
- jenkins 管理员密码重置
- java.sql.SQLException: The server time zone value &#39;&#195;–&#195;&#194;&#185;&#195;&#186;&#194;&#177;&#195;&#170;&#195;—&#194;&#188;&#195;Š&#194;&#177;&#194;&#188;&#195;&#164;&#39; is unrecognized or repr
- gitblit 数据迁移(复制)